From e8381777acc0e00781bd22cb668e39c42f2d6b32 Mon Sep 17 00:00:00 2001 From: James King Date: Wed, 17 Jan 2024 13:24:26 -0800 Subject: [PATCH] OpenAPI generated code at 2024-01-17T21:24:09Z --- CHANGELOG.md | 32 + api.ts | 2690 +---------------- base.ts | 2 +- common.ts | 2 +- configuration.ts | 4 +- dist/api.d.ts | 742 +---- dist/api.js | 4 +- dist/base.d.ts | 2 +- dist/base.js | 4 +- dist/common.d.ts | 2 +- dist/common.js | 4 +- dist/configuration.d.ts | 2 +- dist/configuration.js | 6 +- dist/index.d.ts | 2 +- dist/index.js | 4 +- index.ts | 2 +- package.json | 2 +- .../typescript-axios/modelGeneric.mustache | 6 +- 18 files changed, 58 insertions(+), 3454 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 349f8fe8..7da7d4fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ See full changelog for the OpenAPI schema (OAS) [here](https://github.com/plaid/plaid-openapi/blob/master/CHANGELOG.md). +# 19.0.0 +- Updating to OAS 2020-09-14_1.485.1 + +## Breaking changes in this version +- Most usage of index signatures has been removed. This will allow for stricter types and improved type safety for a better developer experience. + - For versions `19.0.0` and beyond, Plaid recommends updating to the latest version of `plaid-node` to access the latest type definitions. + - In most cases, updating to the latest version of `plaid-node` will not require code changes - available fields should be explicitly defined on the provided types. + - When upgrading from `<19.0.0`, there is a small chance that code depending on properties that previously were not explicitly defined on a type may need to be updated. To do so: + - Identify properties that the index signature previously covered. + - Identify uses of these properties in your code. + - Refactor your code. Some possible solutions include: + - No longer using these properties. + - Defining a new type that re-introduces index signatures via type intersection. For example: + ```typescript + type ExtendedSandboxPublicTokenCreateResponse = SandboxPublicTokenCreateResponse & { [key: string]: any; } + ``` + - Using type assertions. For example, if your code previously relied on a string property `foo` of `SandboxPublicTokenCreateResponse`: + ```typescript + type ExtendedSandboxPublicTokenCreateResponse = SandboxPublicTokenCreateResponse & { foo: string } + + const response = await plaidClient.sandboxPublicTokenCreate(request); + + if ((response.data as any).foo != null) { + const { foo } = response.data as ExtendedSandboxPublicTokenCreateResponse; + } + ``` + - If you are unable to update `plaid-node`, previous versions of `plaid-node` will not have index signatures removed. If you wish to improve type safety, consider using type assertions and defining custom types based on the types available in the currently-used version of `plaid-node` (See the example above for a suggested approach). + +## OpenAPI Schema Changes +### 2020-09-14_1.485.1 +- Update `legal_name` description in `user` object in `/link/token.create` request + # 18.3.0 - Updating to OAS 2020-09-14_1.485.0 diff --git a/api.ts b/api.ts index 3b0b2569..938c5951 100644 --- a/api.ts +++ b/api.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -38,10 +38,7 @@ export enum ACHClass { * @export * @interface APR */ -// Edited by Plaid, line 9. any to unknown export interface APR { - [key: string]: object | unknown; - /** * Annual Percentage Rate applied. * @type {number} @@ -84,7 +81,6 @@ export enum APRAprTypeEnum { * @export * @interface AccountAccess */ -// Edited by Plaid, line 9. any to unknown export interface AccountAccess { /** * The unique account identifier for this account. This value must match that returned by the data access API for this account. @@ -110,7 +106,6 @@ export interface AccountAccess { * @export * @interface AccountAssets */ -// Edited by Plaid, line 9. any to unknown export interface AccountAssets { /** * Plaid’s unique identifier for the account. This value will not change unless Plaid can\'t reconcile the account with the data returned by the financial institution. This may occur, for example, when the name of the account changes. If this happens a new `account_id` will be assigned to the account. The `account_id` can also change if the `access_token` is deleted and the same credentials that were used to generate that `access_token` are used to generate a new `access_token` on a later date. In that case, the new `account_id` will be different from the old `account_id`. If an account with a specific `account_id` disappears instead of changing, the account is likely closed. Closed accounts are not returned by the Plaid API. Like all Plaid identifiers, the `account_id` is case sensitive. @@ -223,7 +218,6 @@ export enum AccountAssetsVerificationStatusEnum { * @export * @interface AccountAssetsAllOf */ -// Edited by Plaid, line 9. any to unknown export interface AccountAssetsAllOf { /** * The duration of transaction history available for this Item, typically defined as the time since the date of the earliest transaction in that account. @@ -267,10 +261,7 @@ export interface AccountAssetsAllOf { * @export * @interface AccountBalance */ -// Edited by Plaid, line 9. any to unknown export interface AccountBalance { - [key: string]: object | unknown; - /** * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts (or `brokerage`-type accounts for API versions 2018-05-22 and earlier), the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. If `current` is `null` this field is guaranteed not to be `null`. * @type {number} @@ -313,10 +304,7 @@ export interface AccountBalance { * @export * @interface AccountBase */ -// Edited by Plaid, line 9. any to unknown export interface AccountBase { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for the account. This value will not change unless Plaid can\'t reconcile the account with the data returned by the financial institution. This may occur, for example, when the name of the account changes. If this happens a new `account_id` will be assigned to the account. The `account_id` can also change if the `access_token` is deleted and the same credentials that were used to generate that `access_token` are used to generate a new `access_token` on a later date. In that case, the new `account_id` will be different from the old `account_id`. If an account with a specific `account_id` disappears instead of changing, the account is likely closed. Closed accounts are not returned by the Plaid API. Like all Plaid identifiers, the `account_id` is case sensitive. * @type {string} @@ -392,7 +380,6 @@ export enum AccountBaseVerificationStatusEnum { * @export * @interface AccountFilter */ -// Edited by Plaid, line 9. any to unknown export interface AccountFilter { /** * A list of account subtypes to be filtered. @@ -424,10 +411,7 @@ export interface AccountFilter { * @export * @interface AccountFiltersResponse */ -// Edited by Plaid, line 9. any to unknown export interface AccountFiltersResponse { - [key: string]: object | unknown; - /** * * @type {DepositoryFilter} @@ -458,7 +442,6 @@ export interface AccountFiltersResponse { * @export * @interface AccountIdentity */ -// Edited by Plaid, line 9. any to unknown export interface AccountIdentity { /** * Plaid’s unique identifier for the account. This value will not change unless Plaid can\'t reconcile the account with the data returned by the financial institution. This may occur, for example, when the name of the account changes. If this happens a new `account_id` will be assigned to the account. The `account_id` can also change if the `access_token` is deleted and the same credentials that were used to generate that `access_token` are used to generate a new `access_token` on a later date. In that case, the new `account_id` will be different from the old `account_id`. If an account with a specific `account_id` disappears instead of changing, the account is likely closed. Closed accounts are not returned by the Plaid API. Like all Plaid identifiers, the `account_id` is case sensitive. @@ -547,7 +530,6 @@ export enum AccountIdentityVerificationStatusEnum { * @export * @interface AccountIdentityAllOf */ -// Edited by Plaid, line 9. any to unknown export interface AccountIdentityAllOf { /** * Data returned by the financial institution about the account owner or owners. Only returned by Identity or Assets endpoints. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution; detecting whether the linked account is a business account is not currently supported. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29) @@ -567,7 +549,6 @@ export interface AccountIdentityAllOf { * @export * @interface AccountIdentityMatchScore */ -// Edited by Plaid, line 9. any to unknown export interface AccountIdentityMatchScore { /** * Plaid’s unique identifier for the account. This value will not change unless Plaid can\'t reconcile the account with the data returned by the financial institution. This may occur, for example, when the name of the account changes. If this happens a new `account_id` will be assigned to the account. The `account_id` can also change if the `access_token` is deleted and the same credentials that were used to generate that `access_token` are used to generate a new `access_token` on a later date. In that case, the new `account_id` will be different from the old `account_id`. If an account with a specific `account_id` disappears instead of changing, the account is likely closed. Closed accounts are not returned by the Plaid API. Like all Plaid identifiers, the `account_id` is case sensitive. @@ -668,7 +649,6 @@ export enum AccountIdentityMatchScoreVerificationStatusEnum { * @export * @interface AccountIdentityMatchScoreAllOf */ -// Edited by Plaid, line 9. any to unknown export interface AccountIdentityMatchScoreAllOf { /** * @@ -700,7 +680,6 @@ export interface AccountIdentityMatchScoreAllOf { * @export * @interface AccountProductAccess */ -// Edited by Plaid, line 9. any to unknown export interface AccountProductAccess { /** * Allow the application to access account data. Only used by certain partners. If relevant to the partner and unset, defaults to `true`. @@ -726,7 +705,6 @@ export interface AccountProductAccess { * @export * @interface AccountProductAccessNullable */ -// Edited by Plaid, line 9. any to unknown export interface AccountProductAccessNullable { /** * Allow the application to access account data. Only used by certain partners. If relevant to the partner and unset, defaults to `true`. @@ -859,7 +837,6 @@ export enum AccountType { * @export * @interface AccountsBalanceGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AccountsBalanceGetRequest { /** * The access token associated with the Item data is being requested for. @@ -897,7 +874,6 @@ export interface AccountsBalanceGetRequest { * @export * @interface AccountsBalanceGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AccountsBalanceGetRequestOptions { /** * A list of `account_ids` to retrieve for the Item. The default value is `null`. Note: An error will be returned if a provided `account_id` is not associated with the Item. @@ -917,10 +893,7 @@ export interface AccountsBalanceGetRequestOptions { * @export * @interface AccountsBalanceGetRequestPaymentDetails */ -// Edited by Plaid, line 9. any to unknown export interface AccountsBalanceGetRequestPaymentDetails { - [key: string]: object | unknown; - /** * The Plaid `account_id` of the account that is the funding source for the proposed transaction. The `account_id` is returned in the `/accounts/get` endpoint as well as the [`onSuccess`](/docs/link/ios/#link-ios-onsuccess-linkSuccess-metadata-accounts-id) callback metadata. This will return an [`INVALID_ACCOUNT_ID`](/docs/errors/invalid-input/#invalid_account_id) error if the account has been removed at the bank or if the `account_id` is no longer valid. * @type {string} @@ -951,10 +924,7 @@ export interface AccountsBalanceGetRequestPaymentDetails { * @export * @interface AccountsBalanceGetResponsePaymentRiskAssessment */ -// Edited by Plaid, line 9. any to unknown export interface AccountsBalanceGetResponsePaymentRiskAssessment { - [key: string]: object | unknown; - /** * A five-tier risk assessment for the transaction based on the probability of return. * @type {string} @@ -973,7 +943,6 @@ export interface AccountsBalanceGetResponsePaymentRiskAssessment { * @export * @interface AccountsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AccountsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1005,7 +974,6 @@ export interface AccountsGetRequest { * @export * @interface AccountsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AccountsGetRequestOptions { /** * An array of `account_ids` to retrieve for the Account. @@ -1019,10 +987,7 @@ export interface AccountsGetRequestOptions { * @export * @interface AccountsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface AccountsGetResponse { - [key: string]: object | unknown; - /** * An array of financial institution accounts associated with the Item. If `/accounts/balance/get` was called, each account will include real-time balance information. * @type {Array} @@ -1066,7 +1031,6 @@ export enum ActionState { * @export * @interface Activity */ -// Edited by Plaid, line 9. any to unknown export interface Activity { /** * @@ -1134,10 +1098,7 @@ export enum ActivityType { * @export * @interface Address */ -// Edited by Plaid, line 9. any to unknown export interface Address { - [key: string]: object | unknown; - /** * * @type {AddressData} @@ -1156,10 +1117,7 @@ export interface Address { * @export * @interface AddressData */ -// Edited by Plaid, line 9. any to unknown export interface AddressData { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -1196,10 +1154,7 @@ export interface AddressData { * @export * @interface AddressDataNotRequired */ -// Edited by Plaid, line 9. any to unknown export interface AddressDataNotRequired { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -1236,7 +1191,6 @@ export interface AddressDataNotRequired { * @export * @interface AddressDataNullable */ -// Edited by Plaid, line 9. any to unknown export interface AddressDataNullable { /** * The full city name @@ -1274,7 +1228,6 @@ export interface AddressDataNullable { * @export * @interface AddressDataNullableNoRequiredFields */ -// Edited by Plaid, line 9. any to unknown export interface AddressDataNullableNoRequiredFields { /** * The full city name @@ -1312,10 +1265,7 @@ export interface AddressDataNullableNoRequiredFields { * @export * @interface AddressMatchScore */ -// Edited by Plaid, line 9. any to unknown export interface AddressMatchScore { - [key: string]: object | unknown; - /** * Match score for address. 100 is a perfect match, 99-90 is a strong match, 89-70 is a partial match, anything below 70 is considered a weak match. Typically, the match threshold should be set to a score of 70 or higher. If the address is missing from either the API or financial institution, this is null. * @type {number} @@ -1334,7 +1284,6 @@ export interface AddressMatchScore { * @export * @interface AddressNullable */ -// Edited by Plaid, line 9. any to unknown export interface AddressNullable { /** * @@ -1365,7 +1314,6 @@ export enum AddressPurposeLabel { * @export * @interface Application */ -// Edited by Plaid, line 9. any to unknown export interface Application { /** * This field will map to the application ID that is returned from /item/application/list, or provided to the institution in an oauth redirect. @@ -1451,7 +1399,6 @@ export interface Application { * @export * @interface ApplicationGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ApplicationGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1477,10 +1424,7 @@ export interface ApplicationGetRequest { * @export * @interface ApplicationGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ApplicationGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -1499,10 +1443,7 @@ export interface ApplicationGetResponse { * @export * @interface Asset */ -// Edited by Plaid, line 9. any to unknown export interface Asset { - [key: string]: object | unknown; - /** * * @type {AssetDetail} @@ -1539,10 +1480,7 @@ export interface Asset { * @export * @interface AssetDetail */ -// Edited by Plaid, line 9. any to unknown export interface AssetDetail { - [key: string]: object | unknown; - /** * A vendor created unique Identifier. * @type {string} @@ -1609,10 +1547,7 @@ export interface AssetDetail { * @export * @interface AssetHolder */ -// Edited by Plaid, line 9. any to unknown export interface AssetHolder { - [key: string]: object | unknown; - /** * * @type {AssetHolderName} @@ -1625,10 +1560,7 @@ export interface AssetHolder { * @export * @interface AssetHolderName */ -// Edited by Plaid, line 9. any to unknown export interface AssetHolderName { - [key: string]: object | unknown; - /** * The unparsed name of either an individual or a legal entity. * @type {string} @@ -1641,10 +1573,7 @@ export interface AssetHolderName { * @export * @interface AssetOwner */ -// Edited by Plaid, line 9. any to unknown export interface AssetOwner { - [key: string]: object | unknown; - /** * Account Owner Full Name. * @type {string} @@ -1657,10 +1586,7 @@ export interface AssetOwner { * @export * @interface AssetOwners */ -// Edited by Plaid, line 9. any to unknown export interface AssetOwners { - [key: string]: object | unknown; - /** * Multiple Occurances of Account Owners Full Name up to 4. * @type {Array} @@ -1673,10 +1599,7 @@ export interface AssetOwners { * @export * @interface AssetReport */ -// Edited by Plaid, line 9. any to unknown export interface AssetReport { - [key: string]: object | unknown; - /** * A unique ID identifying an Asset Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -1729,7 +1652,6 @@ export enum AssetReportAddOns { * @export * @interface AssetReportAuditCopyCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportAuditCopyCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1761,10 +1683,7 @@ export interface AssetReportAuditCopyCreateRequest { * @export * @interface AssetReportAuditCopyCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportAuditCopyCreateResponse { - [key: string]: object | unknown; - /** * A token that can be shared with a third party auditor to allow them to obtain access to the Asset Report. This token should be stored securely. * @type {string} @@ -1783,7 +1702,6 @@ export interface AssetReportAuditCopyCreateResponse { * @export * @interface AssetReportAuditCopyGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportAuditCopyGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1809,7 +1727,6 @@ export interface AssetReportAuditCopyGetRequest { * @export * @interface AssetReportAuditCopyRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportAuditCopyRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1835,10 +1752,7 @@ export interface AssetReportAuditCopyRemoveRequest { * @export * @interface AssetReportAuditCopyRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportAuditCopyRemoveResponse { - [key: string]: object | unknown; - /** * `true` if the Audit Copy was successfully removed. * @type {boolean} @@ -1857,7 +1771,6 @@ export interface AssetReportAuditCopyRemoveResponse { * @export * @interface AssetReportCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -1895,7 +1808,6 @@ export interface AssetReportCreateRequest { * @export * @interface AssetReportCreateRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportCreateRequestOptions { /** * Client-generated identifier, which can be used by lenders to track loan applications. @@ -1941,10 +1853,7 @@ export interface AssetReportCreateRequestOptions { * @export * @interface AssetReportCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportCreateResponse { - [key: string]: object | unknown; - /** * A token that can be provided to endpoints such as `/asset_report/get` or `/asset_report/pdf/get` to fetch or update an Asset Report. * @type {string} @@ -1969,7 +1878,6 @@ export interface AssetReportCreateResponse { * @export * @interface AssetReportFilterRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportFilterRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -2001,10 +1909,7 @@ export interface AssetReportFilterRequest { * @export * @interface AssetReportFilterResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportFilterResponse { - [key: string]: object | unknown; - /** * A token that can be provided to endpoints such as `/asset_report/get` or `/asset_report/pdf/get` to fetch or update an Asset Report. * @type {string} @@ -2029,10 +1934,7 @@ export interface AssetReportFilterResponse { * @export * @interface AssetReportFreddie */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportFreddie { - [key: string]: object | unknown; - /** * * @type {Loans} @@ -2057,10 +1959,7 @@ export interface AssetReportFreddie { * @export * @interface AssetReportFreddieGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportFreddieGetRequest { - [key: string]: object | unknown; - /** * A token that can be shared with a third party auditor to allow them to obtain access to the Asset Report. This token should be stored securely. * @type {string} @@ -2085,10 +1984,7 @@ export interface AssetReportFreddieGetRequest { * @export * @interface AssetReportFreddieGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportFreddieGetResponse { - [key: string]: object | unknown; - /** * * @type {AssetReportFreddie} @@ -2113,7 +2009,6 @@ export interface AssetReportFreddieGetResponse { * @export * @interface AssetReportGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -2163,7 +2058,6 @@ export interface AssetReportGetRequest { * @export * @interface AssetReportGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportGetRequestOptions { /** * The maximum number of days of history to include in the Asset Report. @@ -2177,10 +2071,7 @@ export interface AssetReportGetRequestOptions { * @export * @interface AssetReportGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportGetResponse { - [key: string]: object | unknown; - /** * * @type {AssetReport} @@ -2205,10 +2096,7 @@ export interface AssetReportGetResponse { * @export * @interface AssetReportInvestmentHolding */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportInvestmentHolding { - [key: string]: object | unknown; - /** * The Plaid `account_id` associated with the holding. * @type {string} @@ -2275,10 +2163,7 @@ export interface AssetReportInvestmentHolding { * @export * @interface AssetReportInvestmentSecurity */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportInvestmentSecurity { - [key: string]: object | unknown; - /** * A unique, Plaid-specific identifier for the security, used to associate securities with holdings. Like all Plaid identifiers, the `security_id` is case sensitive. The `security_id` may change if inherent details of the security change due to a corporate action, for example, in the event of a ticker symbol change or CUSIP change. * @type {string} @@ -2309,10 +2194,7 @@ export interface AssetReportInvestmentSecurity { * @export * @interface AssetReportInvestments */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportInvestments { - [key: string]: object | unknown; - /** * The ID of the Investment transaction, unique across all Plaid transactions. Like all Plaid identifiers, the `investment_transaction_id` is case sensitive. * @type {string} @@ -2397,10 +2279,7 @@ export interface AssetReportInvestments { * @export * @interface AssetReportItem */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportItem { - [key: string]: object | unknown; - /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -2437,7 +2316,6 @@ export interface AssetReportItem { * @export * @interface AssetReportPDFGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportPDFGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -2469,7 +2347,6 @@ export interface AssetReportPDFGetRequest { * @export * @interface AssetReportPDFGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportPDFGetRequestOptions { /** * The maximum integer number of days of history to include in the Asset Report. @@ -2483,7 +2360,6 @@ export interface AssetReportPDFGetRequestOptions { * @export * @interface AssetReportRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -2521,7 +2397,6 @@ export interface AssetReportRefreshRequest { * @export * @interface AssetReportRefreshRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportRefreshRequestOptions { /** * Client-generated identifier, which can be used by lenders to track loan applications. @@ -2547,10 +2422,7 @@ export interface AssetReportRefreshRequestOptions { * @export * @interface AssetReportRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportRefreshResponse { - [key: string]: object | unknown; - /** * A unique ID identifying an Asset Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -2575,7 +2447,6 @@ export interface AssetReportRefreshResponse { * @export * @interface AssetReportRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -2601,10 +2472,7 @@ export interface AssetReportRemoveRequest { * @export * @interface AssetReportRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportRemoveResponse { - [key: string]: object | unknown; - /** * `true` if the Asset Report was successfully removed. * @type {boolean} @@ -2623,10 +2491,7 @@ export interface AssetReportRemoveResponse { * @export * @interface AssetReportTransaction */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportTransaction { - [key: string]: object | unknown; - /** * The ID of the account in which this transaction occurred. * @type {string} @@ -2771,10 +2636,7 @@ export enum AssetReportTransactionType { * @export * @interface AssetReportUser */ -// Edited by Plaid, line 9. any to unknown export interface AssetReportUser { - [key: string]: object | unknown; - /** * An identifier you determine and submit for the user. * @type {string} @@ -2823,10 +2685,7 @@ export interface AssetReportUser { * @export * @interface AssetTransaction */ -// Edited by Plaid, line 9. any to unknown export interface AssetTransaction { - [key: string]: object | unknown; - /** * * @type {AssetTransactionDetail} @@ -2960,10 +2819,7 @@ export enum AssetTransactionCategoryType { * @export * @interface AssetTransactionDescription */ -// Edited by Plaid, line 9. any to unknown export interface AssetTransactionDescription { - [key: string]: object | unknown; - /** * Asset Transaction Description String up to 3 occurances 1 required. * @type {string} @@ -2976,10 +2832,7 @@ export interface AssetTransactionDescription { * @export * @interface AssetTransactionDetail */ -// Edited by Plaid, line 9. any to unknown export interface AssetTransactionDetail { - [key: string]: object | unknown; - /** * A vendor created unique Identifier. * @type {string} @@ -3050,10 +2903,7 @@ export enum AssetTransactionType { * @export * @interface AssetTransactions */ -// Edited by Plaid, line 9. any to unknown export interface AssetTransactions { - [key: string]: object | unknown; - /** * * @type {Array} @@ -3079,10 +2929,7 @@ export enum AssetType { * @export * @interface Assets */ -// Edited by Plaid, line 9. any to unknown export interface Assets { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -3095,10 +2942,7 @@ export interface Assets { * @export * @interface AssetsErrorWebhook */ -// Edited by Plaid, line 9. any to unknown export interface AssetsErrorWebhook { - [key: string]: object | unknown; - /** * `ASSETS` * @type {string} @@ -3141,10 +2985,7 @@ export interface AssetsErrorWebhook { * @export * @interface AssetsProductReadyWebhook */ -// Edited by Plaid, line 9. any to unknown export interface AssetsProductReadyWebhook { - [key: string]: object | unknown; - /** * `ASSETS` * @type {string} @@ -3187,10 +3028,7 @@ export interface AssetsProductReadyWebhook { * @export * @interface AuthGetNumbers */ -// Edited by Plaid, line 9. any to unknown export interface AuthGetNumbers { - [key: string]: object | unknown; - /** * An array of ACH numbers identifying accounts. * @type {Array} @@ -3221,7 +3059,6 @@ export interface AuthGetNumbers { * @export * @interface AuthGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface AuthGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -3253,7 +3090,6 @@ export interface AuthGetRequest { * @export * @interface AuthGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface AuthGetRequestOptions { /** * A list of `account_ids` to retrieve for the Item. Note: An error will be returned if a provided `account_id` is not associated with the Item. @@ -3267,10 +3103,7 @@ export interface AuthGetRequestOptions { * @export * @interface AuthGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface AuthGetResponse { - [key: string]: object | unknown; - /** * The `accounts` for which numbers are being retrieved. * @type {Array} @@ -3301,10 +3134,7 @@ export interface AuthGetResponse { * @export * @interface AuthMetadata */ -// Edited by Plaid, line 9. any to unknown export interface AuthMetadata { - [key: string]: object | unknown; - /** * * @type {AuthSupportedMethods} @@ -3317,10 +3147,7 @@ export interface AuthMetadata { * @export * @interface AuthSupportedMethods */ -// Edited by Plaid, line 9. any to unknown export interface AuthSupportedMethods { - [key: string]: object | unknown; - /** * Indicates if instant auth is supported. * @type {boolean} @@ -3351,10 +3178,7 @@ export interface AuthSupportedMethods { * @export * @interface AutomaticallyVerifiedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface AutomaticallyVerifiedWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -3407,10 +3231,7 @@ export enum BankIncomeCompleteResult { * @export * @interface BankIncomeCompleteWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BankIncomeCompleteWebhook { - [key: string]: object | unknown; - /** * `INCOME` * @type {string} @@ -3457,10 +3278,7 @@ export enum BankIncomeRefreshCompleteResult { * @export * @interface BankIncomeRefreshCompleteWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BankIncomeRefreshCompleteWebhook { - [key: string]: object | unknown; - /** * `INCOME` * @type {string} @@ -3497,10 +3315,7 @@ export interface BankIncomeRefreshCompleteWebhook { * @export * @interface BankIncomeRefreshUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BankIncomeRefreshUpdateWebhook { - [key: string]: object | unknown; - /** * `INCOME` * @type {string} @@ -3531,7 +3346,6 @@ export interface BankIncomeRefreshUpdateWebhook { * @export * @interface BankInitiatedReturnRisk */ -// Edited by Plaid, line 9. any to unknown export interface BankInitiatedReturnRisk { /** * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. @@ -3551,10 +3365,7 @@ export interface BankInitiatedReturnRisk { * @export * @interface BankTransfer */ -// Edited by Plaid, line 9. any to unknown export interface BankTransfer { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a bank transfer. * @type {string} @@ -3663,10 +3474,7 @@ export interface BankTransfer { * @export * @interface BankTransferBalance */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferBalance { - [key: string]: object | unknown; - /** * The total available balance - the sum of all successful debit transfer amounts minus all credit transfer amounts. * @type {string} @@ -3685,7 +3493,6 @@ export interface BankTransferBalance { * @export * @interface BankTransferBalanceGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferBalanceGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -3711,10 +3518,7 @@ export interface BankTransferBalanceGetRequest { * @export * @interface BankTransferBalanceGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferBalanceGetResponse { - [key: string]: object | unknown; - /** * * @type {BankTransferBalance} @@ -3739,7 +3543,6 @@ export interface BankTransferBalanceGetResponse { * @export * @interface BankTransferCancelRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferCancelRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -3765,10 +3568,7 @@ export interface BankTransferCancelRequest { * @export * @interface BankTransferCancelResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferCancelResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -3781,7 +3581,6 @@ export interface BankTransferCancelResponse { * @export * @interface BankTransferCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -3879,10 +3678,7 @@ export interface BankTransferCreateRequest { * @export * @interface BankTransferCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferCreateResponse { - [key: string]: object | unknown; - /** * * @type {BankTransfer} @@ -3912,10 +3708,7 @@ export enum BankTransferDirection { * @export * @interface BankTransferEvent */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferEvent { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers. * @type {number} @@ -4010,7 +3803,6 @@ export enum BankTransferEventListDirection { * @export * @interface BankTransferEventListRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferEventListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4090,10 +3882,7 @@ export interface BankTransferEventListRequest { * @export * @interface BankTransferEventListResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferEventListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -4112,7 +3901,6 @@ export interface BankTransferEventListResponse { * @export * @interface BankTransferEventSyncRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferEventSyncRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4144,10 +3932,7 @@ export interface BankTransferEventSyncRequest { * @export * @interface BankTransferEventSyncResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferEventSyncResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -4179,10 +3964,7 @@ export enum BankTransferEventType { * @export * @interface BankTransferFailure */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferFailure { - [key: string]: object | unknown; - /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the transfer status is `reversed`. For a full listing of ACH return codes, see [Bank Transfers errors](https://plaid.com/docs/errors/bank-transfers/#ach-return-codes). * @type {string} @@ -4201,7 +3983,6 @@ export interface BankTransferFailure { * @export * @interface BankTransferGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4227,10 +4008,7 @@ export interface BankTransferGetRequest { * @export * @interface BankTransferGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferGetResponse { - [key: string]: object | unknown; - /** * * @type {BankTransfer} @@ -4249,7 +4027,6 @@ export interface BankTransferGetResponse { * @export * @interface BankTransferListRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4305,10 +4082,7 @@ export interface BankTransferListRequest { * @export * @interface BankTransferListResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -4327,7 +4101,6 @@ export interface BankTransferListResponse { * @export * @interface BankTransferMigrateAccountRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferMigrateAccountRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4371,10 +4144,7 @@ export interface BankTransferMigrateAccountRequest { * @export * @interface BankTransferMigrateAccountResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferMigrateAccountResponse { - [key: string]: object | unknown; - /** * The Plaid `access_token` for the newly created Item. * @type {string} @@ -4423,10 +4193,7 @@ export enum BankTransferStatus { * @export * @interface BankTransferSweep */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferSweep { - [key: string]: object | unknown; - /** * Identifier of the sweep. * @type {string} @@ -4457,7 +4224,6 @@ export interface BankTransferSweep { * @export * @interface BankTransferSweepGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferSweepGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4483,10 +4249,7 @@ export interface BankTransferSweepGetRequest { * @export * @interface BankTransferSweepGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferSweepGetResponse { - [key: string]: object | unknown; - /** * * @type {BankTransferSweep} @@ -4505,7 +4268,6 @@ export interface BankTransferSweepGetResponse { * @export * @interface BankTransferSweepListRequest */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferSweepListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -4549,10 +4311,7 @@ export interface BankTransferSweepListRequest { * @export * @interface BankTransferSweepListResponse */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferSweepListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -4581,10 +4340,7 @@ export enum BankTransferType { * @export * @interface BankTransferUser */ -// Edited by Plaid, line 9. any to unknown export interface BankTransferUser { - [key: string]: object | unknown; - /** * The account holder’s full legal name. If the transfer `ach_class` is `ccd`, this should be the business name of the account holder. * @type {string} @@ -4609,10 +4365,7 @@ export interface BankTransferUser { * @export * @interface BankTransfersEventsUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BankTransfersEventsUpdateWebhook { - [key: string]: object | unknown; - /** * `BANK_TRANSFERS` * @type {string} @@ -4637,10 +4390,7 @@ export interface BankTransfersEventsUpdateWebhook { * @export * @interface BankTransfersEventsUpdateWebhookForAuth */ -// Edited by Plaid, line 9. any to unknown export interface BankTransfersEventsUpdateWebhookForAuth { - [key: string]: object | unknown; - /** * `BANK_TRANSFERS` * @type {string} @@ -4665,10 +4415,7 @@ export interface BankTransfersEventsUpdateWebhookForAuth { * @export * @interface BaseReport */ -// Edited by Plaid, line 9. any to unknown export interface BaseReport { - [key: string]: object | unknown; - /** * A unique ID identifying an Base Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -4699,10 +4446,7 @@ export interface BaseReport { * @export * @interface BaseReportAccount */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAccount { - [key: string]: object | unknown; - /** * * @type {BaseReportAccountBalances} @@ -4781,7 +4525,6 @@ export interface BaseReportAccount { * @export * @interface BaseReportAccountBalances */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAccountBalances { /** * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts (or `brokerage`-type accounts for API versions 2018-05-22 and earlier), the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. If `current` is `null` this field is guaranteed not to be `null`. @@ -4843,7 +4586,6 @@ export interface BaseReportAccountBalances { * @export * @interface BaseReportAccountBalancesAllOf */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAccountBalancesAllOf { /** * The average historical balance for the entire report @@ -4869,10 +4611,7 @@ export interface BaseReportAccountBalancesAllOf { * @export * @interface BaseReportAccountInsights */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAccountInsights { - [key: string]: object | unknown; - /** * Date of the earliest transaction in the base report for the account. * @type {string} @@ -4939,10 +4678,7 @@ export interface BaseReportAccountInsights { * @export * @interface BaseReportAverageFlowInsights */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAverageFlowInsights { - [key: string]: object | unknown; - /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4967,10 +4703,7 @@ export interface BaseReportAverageFlowInsights { * @export * @interface BaseReportAverageMonthlyBalances */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportAverageMonthlyBalances { - [key: string]: object | unknown; - /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4995,7 +4728,6 @@ export interface BaseReportAverageMonthlyBalances { * @export * @interface BaseReportGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -5021,10 +4753,7 @@ export interface BaseReportGetRequest { * @export * @interface BaseReportGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportGetResponse { - [key: string]: object | unknown; - /** * * @type {BaseReport} @@ -5049,10 +4778,7 @@ export interface BaseReportGetResponse { * @export * @interface BaseReportItem */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportItem { - [key: string]: object | unknown; - /** * The full financial institution name associated with the Item. * @type {string} @@ -5083,10 +4809,7 @@ export interface BaseReportItem { * @export * @interface BaseReportLongestGapInsights */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportLongestGapInsights { - [key: string]: object | unknown; - /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -5111,10 +4834,7 @@ export interface BaseReportLongestGapInsights { * @export * @interface BaseReportNumberFlowInsights */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportNumberFlowInsights { - [key: string]: object | unknown; - /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -5139,10 +4859,7 @@ export interface BaseReportNumberFlowInsights { * @export * @interface BaseReportTransaction */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportTransaction { - [key: string]: object | unknown; - /** * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. * @type {number} @@ -5221,10 +4938,7 @@ export interface BaseReportTransaction { * @export * @interface BaseReportWarning */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportWarning { - [key: string]: object | unknown; - /** * The warning type, which will always be `BASE_REPORT_WARNING` * @type {string} @@ -5259,10 +4973,7 @@ export enum BaseReportWarningCode { * @export * @interface BaseReportsErrorWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportsErrorWebhook { - [key: string]: object | unknown; - /** * `BASE_REPORT` * @type {string} @@ -5299,10 +5010,7 @@ export interface BaseReportsErrorWebhook { * @export * @interface BaseReportsProductReadyWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BaseReportsProductReadyWebhook { - [key: string]: object | unknown; - /** * `BASE_REPORT` * @type {string} @@ -5333,10 +5041,7 @@ export interface BaseReportsProductReadyWebhook { * @export * @interface BeaconAuditTrail */ -// Edited by Plaid, line 9. any to unknown export interface BeaconAuditTrail { - [key: string]: object | unknown; - /** * * @type {BeaconAuditTrailSource} @@ -5367,10 +5072,7 @@ export enum BeaconAuditTrailSource { * @export * @interface BeaconDuplicateDetectedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BeaconDuplicateDetectedWebhook { - [key: string]: object | unknown; - /** * `BEACON` * @type {string} @@ -5401,7 +5103,6 @@ export interface BeaconDuplicateDetectedWebhook { * @export * @interface BeaconDuplicateGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconDuplicateGetRequest { /** * ID of the associated Beacon Duplicate. @@ -5427,10 +5128,7 @@ export interface BeaconDuplicateGetRequest { * @export * @interface BeaconDuplicateGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconDuplicateGetResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon Duplicate. * @type {string} @@ -5467,10 +5165,7 @@ export interface BeaconDuplicateGetResponse { * @export * @interface BeaconMatchSummaryAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface BeaconMatchSummaryAnalysis { - [key: string]: object | unknown; - /** * * @type {BeaconMatchSummaryCode} @@ -5531,10 +5226,7 @@ export enum BeaconMatchSummaryCode { * @export * @interface BeaconReport */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReport { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report. * @type {string} @@ -5583,7 +5275,6 @@ export interface BeaconReport { * @export * @interface BeaconReportCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportCreateRequest { /** * ID of the associated Beacon User. @@ -5627,10 +5318,7 @@ export interface BeaconReportCreateRequest { * @export * @interface BeaconReportCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report. * @type {string} @@ -5685,10 +5373,7 @@ export interface BeaconReportCreateResponse { * @export * @interface BeaconReportCreatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportCreatedWebhook { - [key: string]: object | unknown; - /** * `BEACON` * @type {string} @@ -5719,7 +5404,6 @@ export interface BeaconReportCreatedWebhook { * @export * @interface BeaconReportGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportGetRequest { /** * ID of the associated Beacon Report. @@ -5745,10 +5429,7 @@ export interface BeaconReportGetRequest { * @export * @interface BeaconReportGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportGetResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report. * @type {string} @@ -5803,7 +5484,6 @@ export interface BeaconReportGetResponse { * @export * @interface BeaconReportListRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportListRequest { /** * ID of the associated Beacon User. @@ -5835,10 +5515,7 @@ export interface BeaconReportListRequest { * @export * @interface BeaconReportListResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -5863,10 +5540,7 @@ export interface BeaconReportListResponse { * @export * @interface BeaconReportSyndication */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndication { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report Syndication. * @type {string} @@ -5891,10 +5565,7 @@ export interface BeaconReportSyndication { * @export * @interface BeaconReportSyndicationAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationAnalysis { - [key: string]: object | unknown; - /** * * @type {BeaconMatchSummaryCode} @@ -5943,10 +5614,7 @@ export interface BeaconReportSyndicationAnalysis { * @export * @interface BeaconReportSyndicationCreatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationCreatedWebhook { - [key: string]: object | unknown; - /** * `BEACON` * @type {string} @@ -5977,7 +5645,6 @@ export interface BeaconReportSyndicationCreatedWebhook { * @export * @interface BeaconReportSyndicationGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationGetRequest { /** * ID of the associated Beacon Report Syndication. @@ -6003,10 +5670,7 @@ export interface BeaconReportSyndicationGetRequest { * @export * @interface BeaconReportSyndicationGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationGetResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report Syndication. * @type {string} @@ -6037,7 +5701,6 @@ export interface BeaconReportSyndicationGetResponse { * @export * @interface BeaconReportSyndicationListRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationListRequest { /** * ID of the associated Beacon User. @@ -6069,10 +5732,7 @@ export interface BeaconReportSyndicationListRequest { * @export * @interface BeaconReportSyndicationListResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -6097,10 +5757,7 @@ export interface BeaconReportSyndicationListResponse { * @export * @interface BeaconReportSyndicationOriginalReport */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportSyndicationOriginalReport { - [key: string]: object | unknown; - /** * ID of the associated Beacon Report. * @type {string} @@ -6144,10 +5801,7 @@ export enum BeaconReportType { * @export * @interface BeaconReportUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BeaconReportUpdatedWebhook { - [key: string]: object | unknown; - /** * `BEACON` * @type {string} @@ -6178,10 +5832,7 @@ export interface BeaconReportUpdatedWebhook { * @export * @interface BeaconUserAddress */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserAddress { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -6224,7 +5875,6 @@ export interface BeaconUserAddress { * @export * @interface BeaconUserCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserCreateRequest { /** * ID of the associated Beacon Program. @@ -6262,10 +5912,7 @@ export interface BeaconUserCreateRequest { * @export * @interface BeaconUserCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon User. * @type {string} @@ -6326,10 +5973,7 @@ export interface BeaconUserCreateResponse { * @export * @interface BeaconUserData */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserData { - [key: string]: object | unknown; - /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6378,7 +6022,6 @@ export interface BeaconUserData { * @export * @interface BeaconUserGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserGetRequest { /** * ID of the associated Beacon User. @@ -6404,10 +6047,7 @@ export interface BeaconUserGetRequest { * @export * @interface BeaconUserGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserGetResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon User. * @type {string} @@ -6468,10 +6108,7 @@ export interface BeaconUserGetResponse { * @export * @interface BeaconUserIDNumber */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserIDNumber { - [key: string]: object | unknown; - /** * Value of identity document value typed in by user. Alpha-numeric, with all formatting characters stripped. * @type {string} @@ -6490,10 +6127,7 @@ export interface BeaconUserIDNumber { * @export * @interface BeaconUserName */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserName { - [key: string]: object | unknown; - /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -6512,10 +6146,7 @@ export interface BeaconUserName { * @export * @interface BeaconUserNameNullable */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserNameNullable { - [key: string]: object | unknown; - /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -6534,10 +6165,7 @@ export interface BeaconUserNameNullable { * @export * @interface BeaconUserRequestAddress */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserRequestAddress { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -6580,10 +6208,7 @@ export interface BeaconUserRequestAddress { * @export * @interface BeaconUserRequestAddressNullable */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserRequestAddressNullable { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -6626,10 +6251,7 @@ export interface BeaconUserRequestAddressNullable { * @export * @interface BeaconUserRequestData */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserRequestData { - [key: string]: object | unknown; - /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6678,7 +6300,6 @@ export interface BeaconUserRequestData { * @export * @interface BeaconUserReviewRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserReviewRequest { /** * ID of the associated Beacon User. @@ -6710,10 +6331,7 @@ export interface BeaconUserReviewRequest { * @export * @interface BeaconUserRevision */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserRevision { - [key: string]: object | unknown; - /** * ID of the associated Beacon User. * @type {string} @@ -6743,10 +6361,7 @@ export enum BeaconUserStatus { * @export * @interface BeaconUserStatusUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserStatusUpdatedWebhook { - [key: string]: object | unknown; - /** * `BEACON` * @type {string} @@ -6777,7 +6392,6 @@ export interface BeaconUserStatusUpdatedWebhook { * @export * @interface BeaconUserUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserUpdateRequest { /** * ID of the associated Beacon User. @@ -6809,10 +6423,7 @@ export interface BeaconUserUpdateRequest { * @export * @interface BeaconUserUpdateRequestData */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserUpdateRequestData { - [key: string]: object | unknown; - /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6861,10 +6472,7 @@ export interface BeaconUserUpdateRequestData { * @export * @interface BeaconUserUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface BeaconUserUpdateResponse { - [key: string]: object | unknown; - /** * ID of the associated Beacon User. * @type {string} @@ -6925,10 +6533,7 @@ export interface BeaconUserUpdateResponse { * @export * @interface CategoriesGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CategoriesGetResponse { - [key: string]: object | unknown; - /** * An array of all of the transaction categories used by Plaid. * @type {Array} @@ -6947,10 +6552,7 @@ export interface CategoriesGetResponse { * @export * @interface Category */ -// Edited by Plaid, line 9. any to unknown export interface Category { - [key: string]: object | unknown; - /** * An identifying number for the category. `category_id` is a Plaid-specific identifier and does not necessarily correspond to merchant category codes. * @type {string} @@ -6975,10 +6577,7 @@ export interface Category { * @export * @interface CategoryInsightDetails */ -// Edited by Plaid, line 9. any to unknown export interface CategoryInsightDetails { - [key: string]: object | unknown; - /** * Category name. * @type {string} @@ -7015,10 +6614,7 @@ export interface CategoryInsightDetails { * @export * @interface CategoryInsights */ -// Edited by Plaid, line 9. any to unknown export interface CategoryInsights { - [key: string]: object | unknown; - /** * List of insights of top primary personal finance categories ranked by outflow. * @type {Array} @@ -7037,7 +6633,6 @@ export interface CategoryInsights { * @export * @interface Cause */ -// Edited by Plaid, line 9. any to unknown export interface Cause { /** * @@ -7105,7 +6700,6 @@ export interface Cause { * @export * @interface CauseAllOf */ -// Edited by Plaid, line 9. any to unknown export interface CauseAllOf { /** * The `item_id` of the Item associated with this webhook, warning, or error @@ -7119,10 +6713,7 @@ export interface CauseAllOf { * @export * @interface ClientProvidedEnhancedTransaction */ -// Edited by Plaid, line 9. any to unknown export interface ClientProvidedEnhancedTransaction { - [key: string]: object | unknown; - /** * Unique transaction identifier to tie transactions back to clients\' systems. * @type {string} @@ -7159,10 +6750,7 @@ export interface ClientProvidedEnhancedTransaction { * @export * @interface ClientProvidedEnrichedTransaction */ -// Edited by Plaid, line 9. any to unknown export interface ClientProvidedEnrichedTransaction { - [key: string]: object | unknown; - /** * The unique ID for the transaction as provided by you in the request. * @type {string} @@ -7229,10 +6817,7 @@ export interface ClientProvidedEnrichedTransaction { * @export * @interface ClientProvidedRawTransaction */ -// Edited by Plaid, line 9. any to unknown export interface ClientProvidedRawTransaction { - [key: string]: object | unknown; - /** * A unique ID for the transaction used to help you tie data back to your systems. * @type {string} @@ -7263,10 +6848,7 @@ export interface ClientProvidedRawTransaction { * @export * @interface ClientProvidedTransaction */ -// Edited by Plaid, line 9. any to unknown export interface ClientProvidedTransaction { - [key: string]: object | unknown; - /** * A unique ID for the transaction used to help you tie data back to your systems. * @type {string} @@ -7345,10 +6927,7 @@ export interface ClientProvidedTransaction { * @export * @interface ClientProvidedTransactionLocation */ -// Edited by Plaid, line 9. any to unknown export interface ClientProvidedTransactionLocation { - [key: string]: object | unknown; - /** * The country where the transaction occurred. * @type {string} @@ -7385,7 +6964,6 @@ export interface ClientProvidedTransactionLocation { * @export * @interface ConnectedApplication */ -// Edited by Plaid, line 9. any to unknown export interface ConnectedApplication { /** * This field will map to the application ID that is returned from /item/application/list, or provided to the institution in an oauth redirect. @@ -7457,10 +7035,7 @@ export enum ConsumerReportPermissiblePurpose { * @export * @interface ConsumerReportUserIdentity */ -// Edited by Plaid, line 9. any to unknown export interface ConsumerReportUserIdentity { - [key: string]: object | unknown; - /** * The user\'s first name * @type {string} @@ -7497,10 +7072,7 @@ export interface ConsumerReportUserIdentity { * @export * @interface Counterparty */ -// Edited by Plaid, line 9. any to unknown export interface Counterparty { - [key: string]: object | unknown; - /** * The name of the counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -7549,10 +7121,7 @@ export interface Counterparty { * @export * @interface CounterpartyInsights */ -// Edited by Plaid, line 9. any to unknown export interface CounterpartyInsights { - [key: string]: object | unknown; - /** * Insights related to a user’s transactions with other financial institutions, including detected account types. * @type {Array} @@ -7611,7 +7180,6 @@ export enum CountryCode { * @export * @interface CraBankIncome */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncome { /** * The unique identifier associated with the Bank Income Report. @@ -7655,7 +7223,6 @@ export interface CraBankIncome { * @export * @interface CraBankIncomeAccount */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeAccount { /** * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. @@ -7699,7 +7266,6 @@ export interface CraBankIncomeAccount { * @export * @interface CraBankIncomeCause */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeCause { /** * @@ -7741,10 +7307,7 @@ export enum CraBankIncomeCompleteResult { * @export * @interface CraBankIncomeCompleteWebhook */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeCompleteWebhook { - [key: string]: object | unknown; - /** * `CRA_INCOME` * @type {string} @@ -7781,10 +7344,7 @@ export interface CraBankIncomeCompleteWebhook { * @export * @interface CraBankIncomeEmployer */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeEmployer { - [key: string]: object | unknown; - /** * The name of the employer. * @type {string} @@ -7797,7 +7357,6 @@ export interface CraBankIncomeEmployer { * @export * @interface CraBankIncomeGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -7823,10 +7382,7 @@ export interface CraBankIncomeGetRequest { * @export * @interface CraBankIncomeGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeGetResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -7845,10 +7401,7 @@ export interface CraBankIncomeGetResponse { * @export * @interface CraBankIncomeHistoricalSummary */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeHistoricalSummary { - [key: string]: object | unknown; - /** * Total amount of earnings for the income source(s) of the user for the month in the summary. This can contain multiple amounts, with each amount denominated in one unique currency. * @type {Array} @@ -7879,7 +7432,6 @@ export interface CraBankIncomeHistoricalSummary { * @export * @interface CraBankIncomeItem */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeItem { /** * The Item\'s accounts that have Bank Income data. @@ -7917,7 +7469,6 @@ export interface CraBankIncomeItem { * @export * @interface CraBankIncomeSource */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeSource { /** * A unique identifier for an income source. @@ -8021,10 +7572,7 @@ export interface CraBankIncomeSource { * @export * @interface CraBankIncomeSummary */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeSummary { - [key: string]: object | unknown; - /** * Total amount of earnings across all the income sources in the end user\'s Items for the days requested by the client. This can contain multiple amounts, with each amount denominated in one unique currency. * @type {Array} @@ -8091,10 +7639,7 @@ export interface CraBankIncomeSummary { * @export * @interface CraBankIncomeTransaction */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeTransaction { - [key: string]: object | unknown; - /** * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} @@ -8149,7 +7694,6 @@ export interface CraBankIncomeTransaction { * @export * @interface CraBankIncomeWarning */ -// Edited by Plaid, line 9. any to unknown export interface CraBankIncomeWarning { /** * @@ -8187,10 +7731,7 @@ export enum CraBankIncomeWarningCode { * @export * @interface Credit1099 */ -// Edited by Plaid, line 9. any to unknown export interface Credit1099 { - [key: string]: object | unknown; - /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -8509,10 +8050,7 @@ export interface Credit1099 { * @export * @interface Credit1099Filer */ -// Edited by Plaid, line 9. any to unknown export interface Credit1099Filer { - [key: string]: object | unknown; - /** * * @type {CreditPayStubAddress} @@ -8543,10 +8081,7 @@ export interface Credit1099Filer { * @export * @interface Credit1099Payer */ -// Edited by Plaid, line 9. any to unknown export interface Credit1099Payer { - [key: string]: object | unknown; - /** * * @type {CreditPayStubAddress} @@ -8577,10 +8112,7 @@ export interface Credit1099Payer { * @export * @interface Credit1099Recipient */ -// Edited by Plaid, line 9. any to unknown export interface Credit1099Recipient { - [key: string]: object | unknown; - /** * * @type {CreditPayStubAddress} @@ -8645,10 +8177,7 @@ export enum CreditAccountSubtype { * @export * @interface CreditAmountWithCurrency */ -// Edited by Plaid, line 9. any to unknown export interface CreditAmountWithCurrency { - [key: string]: object | unknown; - /** * Value of amount with up to 2 decimal places. * @type {number} @@ -8673,7 +8202,6 @@ export interface CreditAmountWithCurrency { * @export * @interface CreditAuditCopyTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -8699,10 +8227,7 @@ export interface CreditAuditCopyTokenCreateRequest { * @export * @interface CreditAuditCopyTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenCreateResponse { - [key: string]: object | unknown; - /** * A token that can be shared with a third party auditor, which allows them to fetch the Asset Reports attached to the token. This token should be stored securely. * @type {string} @@ -8721,7 +8246,6 @@ export interface CreditAuditCopyTokenCreateResponse { * @export * @interface CreditAuditCopyTokenRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -8747,10 +8271,7 @@ export interface CreditAuditCopyTokenRemoveRequest { * @export * @interface CreditAuditCopyTokenRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenRemoveResponse { - [key: string]: object | unknown; - /** * `true` if the Audit Copy was successfully removed. * @type {boolean} @@ -8769,7 +8290,6 @@ export interface CreditAuditCopyTokenRemoveResponse { * @export * @interface CreditAuditCopyTokenUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -8801,10 +8321,7 @@ export interface CreditAuditCopyTokenUpdateRequest { * @export * @interface CreditAuditCopyTokenUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditAuditCopyTokenUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -8823,7 +8340,6 @@ export interface CreditAuditCopyTokenUpdateResponse { * @export * @interface CreditBankEmployer */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmployer { /** * Name of the employer. @@ -8837,7 +8353,6 @@ export interface CreditBankEmployer { * @export * @interface CreditBankEmployment */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmployment { /** * A unique identifier for the bank employment. @@ -8875,7 +8390,6 @@ export interface CreditBankEmployment { * @export * @interface CreditBankEmploymentGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmploymentGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -8901,10 +8415,7 @@ export interface CreditBankEmploymentGetRequest { * @export * @interface CreditBankEmploymentGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmploymentGetResponse { - [key: string]: object | unknown; - /** * Bank Employment data. Each entry in the array will be a distinct bank employment report. * @type {Array} @@ -8923,7 +8434,6 @@ export interface CreditBankEmploymentGetResponse { * @export * @interface CreditBankEmploymentItem */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmploymentItem { /** * The unique identifier for the Item. @@ -8967,7 +8477,6 @@ export interface CreditBankEmploymentItem { * @export * @interface CreditBankEmploymentReport */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmploymentReport { /** * The unique identifier associated with the Bank Employment Report. @@ -9005,7 +8514,6 @@ export interface CreditBankEmploymentReport { * @export * @interface CreditBankEmploymentWarning */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankEmploymentWarning { /** * @@ -9040,7 +8548,6 @@ export enum CreditBankEmploymentWarningType { * @export * @interface CreditBankIncome */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncome { /** * The unique identifier associated with the Bank Income Report. @@ -9084,7 +8591,6 @@ export interface CreditBankIncome { * @export * @interface CreditBankIncomeAccount */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeAccount { /** * Plaid\'s unique identifier for the account. @@ -9166,7 +8672,6 @@ export enum CreditBankIncomeCategory { * @export * @interface CreditBankIncomeCause */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeCause { /** * @@ -9228,7 +8733,6 @@ export enum CreditBankIncomeErrorType { * @export * @interface CreditBankIncomeGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -9260,7 +8764,6 @@ export interface CreditBankIncomeGetRequest { * @export * @interface CreditBankIncomeGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeGetRequestOptions { /** * How many Bank Income Reports should be fetched. Multiple reports may be available if the report has been re-created or refreshed. If more than one report is available, the most recent reports will be returned first. @@ -9274,10 +8777,7 @@ export interface CreditBankIncomeGetRequestOptions { * @export * @interface CreditBankIncomeGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeGetResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -9296,10 +8796,7 @@ export interface CreditBankIncomeGetResponse { * @export * @interface CreditBankIncomeHistoricalSummary */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeHistoricalSummary { - [key: string]: object | unknown; - /** * Total amount of earnings for the income source(s) of the user for the month in the summary. This may return an incorrect value if the summary includes income sources in multiple currencies. Please use [`total_amounts`](https://plaid.com/docs/api/products/income/#credit-bank_income-get-response-bank-income-items-bank-income-sources-historical-summary-total-amounts) instead. * @type {number} @@ -9351,7 +8848,6 @@ export interface CreditBankIncomeHistoricalSummary { * @export * @interface CreditBankIncomeItem */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeItem { /** * The Item\'s accounts that have Bank Income data. @@ -9395,7 +8891,6 @@ export interface CreditBankIncomeItem { * @export * @interface CreditBankIncomePDFGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomePDFGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -9435,7 +8930,6 @@ export enum CreditBankIncomePayFrequency { * @export * @interface CreditBankIncomeRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -9467,7 +8961,6 @@ export interface CreditBankIncomeRefreshRequest { * @export * @interface CreditBankIncomeRefreshRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeRefreshRequestOptions { /** * How many days of data to include in the refresh. If not specified, this will default to the days requested in the most recently generated bank income report for the user. @@ -9481,10 +8974,7 @@ export interface CreditBankIncomeRefreshRequestOptions { * @export * @interface CreditBankIncomeRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -9497,7 +8987,6 @@ export interface CreditBankIncomeRefreshResponse { * @export * @interface CreditBankIncomeSource */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeSource { /** * A unique identifier for an income source. @@ -9565,10 +9054,7 @@ export interface CreditBankIncomeSource { * @export * @interface CreditBankIncomeSummary */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeSummary { - [key: string]: object | unknown; - /** * Total amount of earnings across all the income sources in the end user\'s Items for the days requested by the client. This may return an incorrect value if the summary includes income sources in multiple currencies. Please use [`total_amounts`](https://plaid.com/docs/api/products/income/#credit-bank_income-get-response-bank-income-bank-income-summary-total-amounts) instead. * @type {number} @@ -9638,10 +9124,7 @@ export interface CreditBankIncomeSummary { * @export * @interface CreditBankIncomeTransaction */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeTransaction { - [key: string]: object | unknown; - /** * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} @@ -9702,7 +9185,6 @@ export interface CreditBankIncomeTransaction { * @export * @interface CreditBankIncomeWarning */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeWarning { /** * @@ -9750,7 +9232,6 @@ export enum CreditBankIncomeWarningType { * @export * @interface CreditBankIncomeWebhookUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeWebhookUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -9782,10 +9263,7 @@ export interface CreditBankIncomeWebhookUpdateRequest { * @export * @interface CreditBankIncomeWebhookUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankIncomeWebhookUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -9798,10 +9276,7 @@ export interface CreditBankIncomeWebhookUpdateResponse { * @export * @interface CreditBankStatementUploadAccountOwner */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadAccountOwner { - [key: string]: object | unknown; - /** * The name of the account owner * @type {string} @@ -9820,10 +9295,7 @@ export interface CreditBankStatementUploadAccountOwner { * @export * @interface CreditBankStatementUploadAccountOwnerAddress */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadAccountOwnerAddress { - [key: string]: object | unknown; - /** * The full city name. * @type {string} @@ -9860,10 +9332,7 @@ export interface CreditBankStatementUploadAccountOwnerAddress { * @export * @interface CreditBankStatementUploadBankAccount */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadBankAccount { - [key: string]: object | unknown; - /** * The name of the bank account * @type {string} @@ -9912,7 +9381,6 @@ export interface CreditBankStatementUploadBankAccount { * @export * @interface CreditBankStatementUploadBankAccountPeriod */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadBankAccountPeriod { /** * The start date of the statement period in ISO 8601 format (YYYY-MM-DD). @@ -9944,7 +9412,6 @@ export interface CreditBankStatementUploadBankAccountPeriod { * @export * @interface CreditBankStatementUploadItem */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadItem { /** * The `item_id` of the Item associated with this webhook, warning, or error @@ -9976,10 +9443,7 @@ export interface CreditBankStatementUploadItem { * @export * @interface CreditBankStatementUploadObject */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadObject { - [key: string]: object | unknown; - /** * An array of transactions appearing on the bank statement. * @type {Array} @@ -10010,7 +9474,6 @@ export interface CreditBankStatementUploadObject { * @export * @interface CreditBankStatementUploadTransaction */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementUploadTransaction { /** * The value of the transaction. A negative amount indicates that money moved into the account (such as a paycheck being deposited). @@ -10042,7 +9505,6 @@ export interface CreditBankStatementUploadTransaction { * @export * @interface CreditBankStatementsUploadsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementsUploadsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -10068,10 +9530,7 @@ export interface CreditBankStatementsUploadsGetRequest { * @export * @interface CreditBankStatementsUploadsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditBankStatementsUploadsGetResponse { - [key: string]: object | unknown; - /** * Array of bank statement upload items. * @type {Array} @@ -10090,10 +9549,7 @@ export interface CreditBankStatementsUploadsGetResponse { * @export * @interface CreditCardLiability */ -// Edited by Plaid, line 9. any to unknown export interface CreditCardLiability { - [key: string]: object | unknown; - /** * The ID of the account that this liability belongs to. * @type {string} @@ -10154,10 +9610,7 @@ export interface CreditCardLiability { * @export * @interface CreditCategory */ -// Edited by Plaid, line 9. any to unknown export interface CreditCategory { - [key: string]: object | unknown; - /** * A high level category that communicates the broad category of the transaction. * @type {string} @@ -10176,10 +9629,7 @@ export interface CreditCategory { * @export * @interface CreditDocumentMetadata */ -// Edited by Plaid, line 9. any to unknown export interface CreditDocumentMetadata { - [key: string]: object | unknown; - /** * The name of the document. * @type {string} @@ -10216,10 +9666,7 @@ export interface CreditDocumentMetadata { * @export * @interface CreditEmployerVerification */ -// Edited by Plaid, line 9. any to unknown export interface CreditEmployerVerification { - [key: string]: object | unknown; - /** * Name of employer. * @type {string} @@ -10232,7 +9679,6 @@ export interface CreditEmployerVerification { * @export * @interface CreditEmploymentGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditEmploymentGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -10258,10 +9704,7 @@ export interface CreditEmploymentGetRequest { * @export * @interface CreditEmploymentGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditEmploymentGetResponse { - [key: string]: object | unknown; - /** * Array of employment items. * @type {Array} @@ -10280,10 +9723,7 @@ export interface CreditEmploymentGetResponse { * @export * @interface CreditEmploymentItem */ -// Edited by Plaid, line 9. any to unknown export interface CreditEmploymentItem { - [key: string]: object | unknown; - /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -10308,10 +9748,7 @@ export interface CreditEmploymentItem { * @export * @interface CreditEmploymentVerification */ -// Edited by Plaid, line 9. any to unknown export interface CreditEmploymentVerification { - [key: string]: object | unknown; - /** * ID of the payroll provider account. * @type {string} @@ -10372,10 +9809,7 @@ export interface CreditEmploymentVerification { * @export * @interface CreditFilter */ -// Edited by Plaid, line 9. any to unknown export interface CreditFilter { - [key: string]: object | unknown; - /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -10388,10 +9822,7 @@ export interface CreditFilter { * @export * @interface CreditFreddieMacAsset */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacAsset { - [key: string]: object | unknown; - /** * * @type {AssetDetail} @@ -10428,10 +9859,7 @@ export interface CreditFreddieMacAsset { * @export * @interface CreditFreddieMacAssetTransaction */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacAssetTransaction { - [key: string]: object | unknown; - /** * * @type {AssetTransactionDetail} @@ -10450,10 +9878,7 @@ export interface CreditFreddieMacAssetTransaction { * @export * @interface CreditFreddieMacAssetTransactions */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacAssetTransactions { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10466,10 +9891,7 @@ export interface CreditFreddieMacAssetTransactions { * @export * @interface CreditFreddieMacAssets */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacAssets { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -10482,10 +9904,7 @@ export interface CreditFreddieMacAssets { * @export * @interface CreditFreddieMacIndividualName */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacIndividualName { - [key: string]: object | unknown; - /** * The first name of the individual represented by the parent object. * @type {string} @@ -10510,10 +9929,7 @@ export interface CreditFreddieMacIndividualName { * @export * @interface CreditFreddieMacLoan */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacLoan { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacLoanIdentifiers} @@ -10532,10 +9948,7 @@ export interface CreditFreddieMacLoan { * @export * @interface CreditFreddieMacLoanIdentifiers */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacLoanIdentifiers { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10548,10 +9961,7 @@ export interface CreditFreddieMacLoanIdentifiers { * @export * @interface CreditFreddieMacLoans */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacLoans { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacLoan} @@ -10564,10 +9974,7 @@ export interface CreditFreddieMacLoans { * @export * @interface CreditFreddieMacParties */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacParties { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10580,10 +9987,7 @@ export interface CreditFreddieMacParties { * @export * @interface CreditFreddieMacParty */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacParty { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacPartyIndividual} @@ -10608,10 +10012,7 @@ export interface CreditFreddieMacParty { * @export * @interface CreditFreddieMacPartyIndividual */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacPartyIndividual { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacIndividualName} @@ -10624,10 +10025,7 @@ export interface CreditFreddieMacPartyIndividual { * @export * @interface CreditFreddieMacReportingInformation */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacReportingInformation { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -10658,7 +10056,6 @@ export interface CreditFreddieMacReportingInformation { * @export * @interface CreditFreddieMacReportsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacReportsGetRequest { /** * A token that can be shared with a third party auditor to allow them to obtain access to the Asset Report. This token should be stored securely. @@ -10684,10 +10081,7 @@ export interface CreditFreddieMacReportsGetRequest { * @export * @interface CreditFreddieMacReportsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacReportsGetResponse { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacVerificationOfAssetsDeal} @@ -10712,10 +10106,7 @@ export interface CreditFreddieMacReportsGetResponse { * @export * @interface CreditFreddieMacService */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacService { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10734,10 +10125,7 @@ export interface CreditFreddieMacService { * @export * @interface CreditFreddieMacServices */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacServices { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacService} @@ -10750,10 +10138,7 @@ export interface CreditFreddieMacServices { * @export * @interface CreditFreddieMacVerificationOfAsset */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacVerificationOfAsset { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacReportingInformation} @@ -10778,10 +10163,7 @@ export interface CreditFreddieMacVerificationOfAsset { * @export * @interface CreditFreddieMacVerificationOfAssetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacVerificationOfAssetResponse { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacAssets} @@ -10794,10 +10176,7 @@ export interface CreditFreddieMacVerificationOfAssetResponse { * @export * @interface CreditFreddieMacVerificationOfAssetsDeal */ -// Edited by Plaid, line 9. any to unknown export interface CreditFreddieMacVerificationOfAssetsDeal { - [key: string]: object | unknown; - /** * * @type {CreditFreddieMacLoans} @@ -10822,10 +10201,7 @@ export interface CreditFreddieMacVerificationOfAssetsDeal { * @export * @interface CreditPayStub */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStub { - [key: string]: object | unknown; - /** * * @type {CreditPayStubDeductions} @@ -10880,10 +10256,7 @@ export interface CreditPayStub { * @export * @interface CreditPayStubAddress */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubAddress { - [key: string]: object | unknown; - /** * The full city name. * @type {string} @@ -10920,10 +10293,7 @@ export interface CreditPayStubAddress { * @export * @interface CreditPayStubDeductions */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubDeductions { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10942,10 +10312,7 @@ export interface CreditPayStubDeductions { * @export * @interface CreditPayStubEarnings */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubEarnings { - [key: string]: object | unknown; - /** * * @type {Array} @@ -10964,10 +10331,7 @@ export interface CreditPayStubEarnings { * @export * @interface CreditPayStubEmployee */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubEmployee { - [key: string]: object | unknown; - /** * * @type {CreditPayStubAddress} @@ -10998,10 +10362,7 @@ export interface CreditPayStubEmployee { * @export * @interface CreditPayStubEmployer */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubEmployer { - [key: string]: object | unknown; - /** * * @type {CreditPayStubAddress} @@ -11020,10 +10381,7 @@ export interface CreditPayStubEmployer { * @export * @interface CreditPayStubNetPay */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayStubNetPay { - [key: string]: object | unknown; - /** * Raw amount of the net pay for the pay period. * @type {number} @@ -11071,7 +10429,6 @@ export enum CreditPayStubPayBasisType { * @export * @interface CreditPayrollIncomeGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11097,10 +10454,7 @@ export interface CreditPayrollIncomeGetRequest { * @export * @interface CreditPayrollIncomeGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeGetResponse { - [key: string]: object | unknown; - /** * Array of payroll items. * @type {Array} @@ -11125,10 +10479,7 @@ export interface CreditPayrollIncomeGetResponse { * @export * @interface CreditPayrollIncomeParsingConfigUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeParsingConfigUpdateRequest { - [key: string]: object | unknown; - /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. * @type {string} @@ -11165,10 +10516,7 @@ export interface CreditPayrollIncomeParsingConfigUpdateRequest { * @export * @interface CreditPayrollIncomeParsingConfigUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeParsingConfigUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -11181,7 +10529,6 @@ export interface CreditPayrollIncomeParsingConfigUpdateResponse { * @export * @interface CreditPayrollIncomePrecheckRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomePrecheckRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11231,10 +10578,7 @@ export interface CreditPayrollIncomePrecheckRequest { * @export * @interface CreditPayrollIncomePrecheckResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomePrecheckResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -11253,7 +10597,6 @@ export interface CreditPayrollIncomePrecheckResponse { * @export * @interface CreditPayrollIncomeRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11285,7 +10628,6 @@ export interface CreditPayrollIncomeRefreshRequest { * @export * @interface CreditPayrollIncomeRefreshRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeRefreshRequestOptions { /** * An array of `item_id`s to be refreshed. Each `item_id` should uniquely identify a payroll income item. If this field is not provided, all `item_id`s associated with the `user_token` will be refreshed. @@ -11305,10 +10647,7 @@ export interface CreditPayrollIncomeRefreshRequestOptions { * @export * @interface CreditPayrollIncomeRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -11327,7 +10666,6 @@ export interface CreditPayrollIncomeRefreshResponse { * @export * @interface CreditPayrollIncomeRiskSignalsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeRiskSignalsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11353,10 +10691,7 @@ export interface CreditPayrollIncomeRiskSignalsGetRequest { * @export * @interface CreditPayrollIncomeRiskSignalsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditPayrollIncomeRiskSignalsGetResponse { - [key: string]: object | unknown; - /** * Array of payroll items. * @type {Array} @@ -11381,10 +10716,7 @@ export interface CreditPayrollIncomeRiskSignalsGetResponse { * @export * @interface CreditPlatformIds */ -// Edited by Plaid, line 9. any to unknown export interface CreditPlatformIds { - [key: string]: object | unknown; - /** * The ID of an employee as given by their employer. * @type {string} @@ -11409,7 +10741,6 @@ export interface CreditPlatformIds { * @export * @interface CreditRelayCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11447,10 +10778,7 @@ export interface CreditRelayCreateRequest { * @export * @interface CreditRelayCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayCreateResponse { - [key: string]: object | unknown; - /** * A token that can be shared with a third party to allow them to access the Asset Report. This token should be stored securely. * @type {string} @@ -11469,7 +10797,6 @@ export interface CreditRelayCreateResponse { * @export * @interface CreditRelayGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11501,7 +10828,6 @@ export interface CreditRelayGetRequest { * @export * @interface CreditRelayPDFGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayPDFGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11533,7 +10859,6 @@ export interface CreditRelayPDFGetRequest { * @export * @interface CreditRelayRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11571,10 +10896,7 @@ export interface CreditRelayRefreshRequest { * @export * @interface CreditRelayRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayRefreshResponse { - [key: string]: object | unknown; - /** * * @type {string} @@ -11599,7 +10921,6 @@ export interface CreditRelayRefreshResponse { * @export * @interface CreditRelayRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11625,10 +10946,7 @@ export interface CreditRelayRemoveRequest { * @export * @interface CreditRelayRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditRelayRemoveResponse { - [key: string]: object | unknown; - /** * `true` if the relay token was successfully removed. * @type {boolean} @@ -11647,7 +10965,6 @@ export interface CreditRelayRemoveResponse { * @export * @interface CreditSession */ -// Edited by Plaid, line 9. any to unknown export interface CreditSession { /** * The unique identifier associated with the Link session. This identifier matches the `link_session_id` returned in the onSuccess/onExit callbacks. @@ -11679,7 +10996,6 @@ export interface CreditSession { * @export * @interface CreditSessionBankEmploymentResult */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionBankEmploymentResult { /** * @@ -11716,7 +11032,6 @@ export enum CreditSessionBankEmploymentStatus { * @export * @interface CreditSessionBankIncomeResult */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionBankIncomeResult { /** * @@ -11753,7 +11068,6 @@ export enum CreditSessionBankIncomeStatus { * @export * @interface CreditSessionDocumentIncomeResult */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionDocumentIncomeResult { /** * The number of paystubs uploaded by the user. @@ -11779,7 +11093,6 @@ export interface CreditSessionDocumentIncomeResult { * @export * @interface CreditSessionError */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionError { /** * A broad categorization of the error. @@ -11811,7 +11124,6 @@ export interface CreditSessionError { * @export * @interface CreditSessionItemAddResult */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionItemAddResult { /** * Returned once a user has successfully linked their Item. @@ -11837,7 +11149,6 @@ export interface CreditSessionItemAddResult { * @export * @interface CreditSessionPayrollIncomeResult */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionPayrollIncomeResult { /** * The number of paystubs retrieved from a payroll provider. @@ -11869,7 +11180,6 @@ export interface CreditSessionPayrollIncomeResult { * @export * @interface CreditSessionResults */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionResults { /** * The set of Item adds for the Link session. @@ -11907,7 +11217,6 @@ export interface CreditSessionResults { * @export * @interface CreditSessionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -11933,10 +11242,7 @@ export interface CreditSessionsGetRequest { * @export * @interface CreditSessionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface CreditSessionsGetResponse { - [key: string]: object | unknown; - /** * A list of Link sessions for the user. Sessions will be sorted in reverse chronological order. * @type {Array} @@ -11955,10 +11261,7 @@ export interface CreditSessionsGetResponse { * @export * @interface CreditW2 */ -// Edited by Plaid, line 9. any to unknown export interface CreditW2 { - [key: string]: object | unknown; - /** * * @type {CreditDocumentMetadata} @@ -12103,7 +11406,6 @@ export interface CreditW2 { * @export * @interface CustomerInitiatedReturnRisk */ -// Edited by Plaid, line 9. any to unknown export interface CustomerInitiatedReturnRisk { /** * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. @@ -12123,10 +11425,7 @@ export interface CustomerInitiatedReturnRisk { * @export * @interface DashboardUser */ -// Edited by Plaid, line 9. any to unknown export interface DashboardUser { - [key: string]: object | unknown; - /** * ID of the associated user. * @type {string} @@ -12157,7 +11456,6 @@ export interface DashboardUser { * @export * @interface DashboardUserGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface DashboardUserGetRequest { /** * ID of the associated user. @@ -12183,10 +11481,7 @@ export interface DashboardUserGetRequest { * @export * @interface DashboardUserGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface DashboardUserGetResponse { - [key: string]: object | unknown; - /** * ID of the associated user. * @type {string} @@ -12223,7 +11518,6 @@ export interface DashboardUserGetResponse { * @export * @interface DashboardUserListRequest */ -// Edited by Plaid, line 9. any to unknown export interface DashboardUserListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -12249,10 +11543,7 @@ export interface DashboardUserListRequest { * @export * @interface DashboardUserListResponse */ -// Edited by Plaid, line 9. any to unknown export interface DashboardUserListResponse { - [key: string]: object | unknown; - /** * List of dashboard users * @type {Array} @@ -12288,10 +11579,7 @@ export enum DashboardUserStatus { * @export * @interface DateRange */ -// Edited by Plaid, line 9. any to unknown export interface DateRange { - [key: string]: object | unknown; - /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -12310,10 +11598,7 @@ export interface DateRange { * @export * @interface Deductions */ -// Edited by Plaid, line 9. any to unknown export interface Deductions { - [key: string]: object | unknown; - /** * * @type {Array} @@ -12346,10 +11631,7 @@ export interface Deductions { * @export * @interface DeductionsBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface DeductionsBreakdown { - [key: string]: object | unknown; - /** * Raw amount of the deduction * @type {number} @@ -12386,10 +11668,7 @@ export interface DeductionsBreakdown { * @export * @interface DeductionsTotal */ -// Edited by Plaid, line 9. any to unknown export interface DeductionsTotal { - [key: string]: object | unknown; - /** * Raw amount of the deduction * @type {number} @@ -12420,10 +11699,7 @@ export interface DeductionsTotal { * @export * @interface DefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface DefaultUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -12466,10 +11742,7 @@ export interface DefaultUpdateWebhook { * @export * @interface DepositSwitchAddressData */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchAddressData { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -12506,7 +11779,6 @@ export interface DepositSwitchAddressData { * @export * @interface DepositSwitchAltCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchAltCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -12560,10 +11832,7 @@ export enum DepositSwitchAltCreateRequestCountryCodeEnum { * @export * @interface DepositSwitchAltCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchAltCreateResponse { - [key: string]: object | unknown; - /** * ID of the deposit switch. This ID is persisted throughout the lifetime of the deposit switch. * @type {string} @@ -12582,7 +11851,6 @@ export interface DepositSwitchAltCreateResponse { * @export * @interface DepositSwitchCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -12636,7 +11904,6 @@ export enum DepositSwitchCreateRequestCountryCodeEnum { * @export * @interface DepositSwitchCreateRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchCreateRequestOptions { /** * The URL registered to receive webhooks when the status of a deposit switch request has changed. @@ -12656,10 +11923,7 @@ export interface DepositSwitchCreateRequestOptions { * @export * @interface DepositSwitchCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchCreateResponse { - [key: string]: object | unknown; - /** * ID of the deposit switch. This ID is persisted throughout the lifetime of the deposit switch. * @type {string} @@ -12678,7 +11942,6 @@ export interface DepositSwitchCreateResponse { * @export * @interface DepositSwitchGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -12704,10 +11967,7 @@ export interface DepositSwitchGetRequest { * @export * @interface DepositSwitchGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchGetResponse { - [key: string]: object | unknown; - /** * The ID of the deposit switch. * @type {string} @@ -12832,7 +12092,6 @@ export enum DepositSwitchGetResponseSwitchMethodEnum { * @export * @interface DepositSwitchStateUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchStateUpdateWebhook { /** * `\"DEPOSIT_SWITCH\"` @@ -12870,10 +12129,7 @@ export interface DepositSwitchStateUpdateWebhook { * @export * @interface DepositSwitchTargetAccount */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchTargetAccount { - [key: string]: object | unknown; - /** * Account number for deposit switch destination * @type {string} @@ -12914,10 +12170,7 @@ export enum DepositSwitchTargetAccountAccountSubtypeEnum { * @export * @interface DepositSwitchTargetUser */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchTargetUser { - [key: string]: object | unknown; - /** * The given name (first name) of the user. * @type {string} @@ -12960,7 +12213,6 @@ export interface DepositSwitchTargetUser { * @export * @interface DepositSwitchTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -12986,10 +12238,7 @@ export interface DepositSwitchTokenCreateRequest { * @export * @interface DepositSwitchTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface DepositSwitchTokenCreateResponse { - [key: string]: object | unknown; - /** * Deposit switch token, used to initialize Link for the Deposit Switch product * @type {string} @@ -13032,10 +12281,7 @@ export enum DepositoryAccountSubtype { * @export * @interface DepositoryFilter */ -// Edited by Plaid, line 9. any to unknown export interface DepositoryFilter { - [key: string]: object | unknown; - /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -13048,10 +12294,7 @@ export interface DepositoryFilter { * @export * @interface DetailedOriginator */ -// Edited by Plaid, line 9. any to unknown export interface DetailedOriginator { - [key: string]: object | unknown; - /** * Originator’s client ID. * @type {string} @@ -13076,10 +12319,7 @@ export interface DetailedOriginator { * @export * @interface DetectedAccount */ -// Edited by Plaid, line 9. any to unknown export interface DetectedAccount { - [key: string]: object | unknown; - /** * The detected account type (depository, credit, loan, investment etc.). * @type {string} @@ -13134,10 +12374,7 @@ export interface DetectedAccount { * @export * @interface DistributionBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface DistributionBreakdown { - [key: string]: object | unknown; - /** * Name of the account for the given distribution. * @type {string} @@ -13213,10 +12450,7 @@ export enum DocType { * @export * @interface DocumentAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface DocumentAnalysis { - [key: string]: object | unknown; - /** * * @type {DocumentAuthenticityMatchCode} @@ -13264,10 +12498,7 @@ export enum DocumentDateOfBirthMatchCode { * @export * @interface DocumentMetadata */ -// Edited by Plaid, line 9. any to unknown export interface DocumentMetadata { - [key: string]: object | unknown; - /** * The name of the document. * @type {string} @@ -13309,10 +12540,7 @@ export enum DocumentNameMatchCode { * @export * @interface DocumentRiskSignal */ -// Edited by Plaid, line 9. any to unknown export interface DocumentRiskSignal { - [key: string]: object | unknown; - /** * The result from the risk signal check. * @type {string} @@ -13367,10 +12595,7 @@ export interface DocumentRiskSignal { * @export * @interface DocumentRiskSignalInstitutionMetadata */ -// Edited by Plaid, line 9. any to unknown export interface DocumentRiskSignalInstitutionMetadata { - [key: string]: object | unknown; - /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -13383,10 +12608,7 @@ export interface DocumentRiskSignalInstitutionMetadata { * @export * @interface DocumentRiskSignalsObject */ -// Edited by Plaid, line 9. any to unknown export interface DocumentRiskSignalsObject { - [key: string]: object | unknown; - /** * ID of the payroll provider account. * @type {string} @@ -13411,10 +12633,7 @@ export interface DocumentRiskSignalsObject { * @export * @interface DocumentRiskSummary */ -// Edited by Plaid, line 9. any to unknown export interface DocumentRiskSummary { - [key: string]: object | unknown; - /** * A number between 0 and 100, inclusive, where a score closer to 0 indicates a document is likely to be trustworthy and a score closer to 100 indicates a document is likely to be fraudulent * @type {number} @@ -13438,10 +12657,7 @@ export enum DocumentStatus { * @export * @interface DocumentaryVerification */ -// Edited by Plaid, line 9. any to unknown export interface DocumentaryVerification { - [key: string]: object | unknown; - /** * The outcome status for the associated Identity Verification attempt\'s `documentary_verification` step. This field will always have the same value as `steps.documentary_verification`. * @type {string} @@ -13460,10 +12676,7 @@ export interface DocumentaryVerification { * @export * @interface DocumentaryVerificationDocument */ -// Edited by Plaid, line 9. any to unknown export interface DocumentaryVerificationDocument { - [key: string]: object | unknown; - /** * * @type {DocumentStatus} @@ -13506,10 +12719,7 @@ export interface DocumentaryVerificationDocument { * @export * @interface Earnings */ -// Edited by Plaid, line 9. any to unknown export interface Earnings { - [key: string]: object | unknown; - /** * * @type {Array} @@ -13542,10 +12752,7 @@ export interface Earnings { * @export * @interface EarningsBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface EarningsBreakdown { - [key: string]: object | unknown; - /** * * @type {EarningsBreakdownCanonicalDescription} @@ -13618,10 +12825,7 @@ export enum EarningsBreakdownCanonicalDescription { * @export * @interface EarningsTotal */ -// Edited by Plaid, line 9. any to unknown export interface EarningsTotal { - [key: string]: object | unknown; - /** * Total amount of the earnings for this pay period * @type {number} @@ -13672,10 +12876,7 @@ export interface EarningsTotal { * @export * @interface Email */ -// Edited by Plaid, line 9. any to unknown export interface Email { - [key: string]: object | unknown; - /** * The email address. * @type {string} @@ -13711,10 +12912,7 @@ export enum EmailTypeEnum { * @export * @interface EmailAddressMatchScore */ -// Edited by Plaid, line 9. any to unknown export interface EmailAddressMatchScore { - [key: string]: object | unknown; - /** * Match score for normalized email. 100 is a perfect match, 99-70 is a partial match (matching the same email with different \'+\' extensions), anything below 70 is considered a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the email is missing from either the API or financial institution, this is null. * @type {number} @@ -13727,10 +12925,7 @@ export interface EmailAddressMatchScore { * @export * @interface Employee */ -// Edited by Plaid, line 9. any to unknown export interface Employee { - [key: string]: object | unknown; - /** * * @type {PaystubAddress} @@ -13761,7 +12956,6 @@ export interface Employee { * @export * @interface EmployeeIncomeSummaryFieldString */ -// Edited by Plaid, line 9. any to unknown export interface EmployeeIncomeSummaryFieldString { /** * The value of the field. @@ -13781,10 +12975,7 @@ export interface EmployeeIncomeSummaryFieldString { * @export * @interface Employer */ -// Edited by Plaid, line 9. any to unknown export interface Employer { - [key: string]: object | unknown; - /** * Plaid\'s unique identifier for the employer. * @type {string} @@ -13815,7 +13006,6 @@ export interface Employer { * @export * @interface EmployerIncomeSummaryFieldString */ -// Edited by Plaid, line 9. any to unknown export interface EmployerIncomeSummaryFieldString { /** * The value of the field. @@ -13835,10 +13025,7 @@ export interface EmployerIncomeSummaryFieldString { * @export * @interface EmployerVerification */ -// Edited by Plaid, line 9. any to unknown export interface EmployerVerification { - [key: string]: object | unknown; - /** * Name of employer. * @type {string} @@ -13851,7 +13038,6 @@ export interface EmployerVerification { * @export * @interface EmployersSearchRequest */ -// Edited by Plaid, line 9. any to unknown export interface EmployersSearchRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -13883,10 +13069,7 @@ export interface EmployersSearchRequest { * @export * @interface EmployersSearchResponse */ -// Edited by Plaid, line 9. any to unknown export interface EmployersSearchResponse { - [key: string]: object | unknown; - /** * A list of employers matching the search criteria. * @type {Array} @@ -13905,10 +13088,7 @@ export interface EmployersSearchResponse { * @export * @interface EmploymentDetails */ -// Edited by Plaid, line 9. any to unknown export interface EmploymentDetails { - [key: string]: object | unknown; - /** * * @type {Pay} @@ -13938,10 +13118,7 @@ export enum EmploymentSourceType { * @export * @interface EmploymentVerification */ -// Edited by Plaid, line 9. any to unknown export interface EmploymentVerification { - [key: string]: object | unknown; - /** * * @type {EmploymentVerificationStatus} @@ -13984,7 +13161,6 @@ export interface EmploymentVerification { * @export * @interface EmploymentVerificationGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface EmploymentVerificationGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -14010,10 +13186,7 @@ export interface EmploymentVerificationGetRequest { * @export * @interface EmploymentVerificationGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface EmploymentVerificationGetResponse { - [key: string]: object | unknown; - /** * A list of employment verification summaries. * @type {Array} @@ -14043,10 +13216,7 @@ export enum EmploymentVerificationStatus { * @export * @interface Enhancements */ -// Edited by Plaid, line 9. any to unknown export interface Enhancements { - [key: string]: object | unknown; - /** * The name of the primary counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -14129,10 +13299,7 @@ export enum EnrichTransactionDirection { * @export * @interface Enrichments */ -// Edited by Plaid, line 9. any to unknown export interface Enrichments { - [key: string]: object | unknown; - /** * The check number of the transaction. This field is only populated for check transactions. * @type {string} @@ -14225,10 +13392,7 @@ export interface Enrichments { * @export * @interface EntityDocument */ -// Edited by Plaid, line 9. any to unknown export interface EntityDocument { - [key: string]: object | unknown; - /** * * @type {EntityDocumentType} @@ -14261,10 +13425,7 @@ export enum EntityDocumentType { * @export * @interface EntityScreeningHitAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitAnalysis { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -14313,10 +13474,7 @@ export interface EntityScreeningHitAnalysis { * @export * @interface EntityScreeningHitData */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitData { - [key: string]: object | unknown; - /** * Documents associated with the watchlist hit * @type {Array} @@ -14359,10 +13517,7 @@ export interface EntityScreeningHitData { * @export * @interface EntityScreeningHitDocumentsItems */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitDocumentsItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -14381,10 +13536,7 @@ export interface EntityScreeningHitDocumentsItems { * @export * @interface EntityScreeningHitEmails */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitEmails { - [key: string]: object | unknown; - /** * A valid email address. * @type {string} @@ -14397,10 +13549,7 @@ export interface EntityScreeningHitEmails { * @export * @interface EntityScreeningHitEmailsItems */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitEmailsItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -14419,10 +13568,7 @@ export interface EntityScreeningHitEmailsItems { * @export * @interface EntityScreeningHitNames */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitNames { - [key: string]: object | unknown; - /** * The full name of the entity. * @type {string} @@ -14447,10 +13593,7 @@ export interface EntityScreeningHitNames { * @export * @interface EntityScreeningHitNamesItems */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitNamesItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -14469,10 +13612,7 @@ export interface EntityScreeningHitNamesItems { * @export * @interface EntityScreeningHitPhoneNumbers */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitPhoneNumbers { - [key: string]: object | unknown; - /** * * @type {PhoneType} @@ -14491,10 +13631,7 @@ export interface EntityScreeningHitPhoneNumbers { * @export * @interface EntityScreeningHitUrls */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitUrls { - [key: string]: object | unknown; - /** * An \'http\' or \'https\' URL (must begin with either of those). * @type {string} @@ -14507,10 +13644,7 @@ export interface EntityScreeningHitUrls { * @export * @interface EntityScreeningHitUrlsItems */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitUrlsItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -14529,10 +13663,7 @@ export interface EntityScreeningHitUrlsItems { * @export * @interface EntityScreeningHitsPhoneNumberItems */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningHitsPhoneNumberItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -14551,10 +13682,7 @@ export interface EntityScreeningHitsPhoneNumberItems { * @export * @interface EntityScreeningStatusUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface EntityScreeningStatusUpdatedWebhook { - [key: string]: object | unknown; - /** * `ENTITY_SCREENING` * @type {string} @@ -14607,10 +13735,7 @@ export enum EntityWatchlistCode { * @export * @interface EntityWatchlistProgram */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistProgram { - [key: string]: object | unknown; - /** * ID of the associated entity program. * @type {string} @@ -14665,10 +13790,7 @@ export interface EntityWatchlistProgram { * @export * @interface EntityWatchlistScreening */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistScreening { - [key: string]: object | unknown; - /** * ID of the associated entity screening. * @type {string} @@ -14711,10 +13833,7 @@ export interface EntityWatchlistScreening { * @export * @interface EntityWatchlistScreeningHit */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistScreeningHit { - [key: string]: object | unknown; - /** * ID of the associated entity screening hit. * @type {string} @@ -14781,10 +13900,7 @@ export interface EntityWatchlistScreeningHit { * @export * @interface EntityWatchlistScreeningReview */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistScreeningReview { - [key: string]: object | unknown; - /** * ID of the associated entity review. * @type {string} @@ -14821,10 +13937,7 @@ export interface EntityWatchlistScreeningReview { * @export * @interface EntityWatchlistScreeningSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistScreeningSearchTerms { - [key: string]: object | unknown; - /** * ID of the associated entity program. * @type {string} @@ -14879,7 +13992,6 @@ export interface EntityWatchlistScreeningSearchTerms { * @export * @interface EntityWatchlistSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface EntityWatchlistSearchTerms { /** * ID of the associated entity program. @@ -14940,7 +14052,6 @@ export enum ExpirationDate { * @export * @interface ExternalPaymentInitiationConsentOptions */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentInitiationConsentOptions { /** * When `true`, Plaid will attempt to request refund details from the payee\'s financial institution. Support varies between financial institutions and will not always be available. If refund details could be retrieved, they will be available in the `/payment_initiation/payment/get` response. @@ -14966,7 +14077,6 @@ export interface ExternalPaymentInitiationConsentOptions { * @export * @interface ExternalPaymentOptions */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentOptions { /** * When `true`, Plaid will attempt to request refund details from the payee\'s financial institution. Support varies between financial institutions and will not always be available. If refund details could be retrieved, they will be available in the `/payment_initiation/payment/get` response. @@ -14998,7 +14108,6 @@ export interface ExternalPaymentOptions { * @export * @interface ExternalPaymentRefundDetails */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentRefundDetails { /** * The name of the account holder. @@ -15024,10 +14133,7 @@ export interface ExternalPaymentRefundDetails { * @export * @interface ExternalPaymentScheduleBase */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentScheduleBase { - [key: string]: object | unknown; - /** * * @type {PaymentScheduleInterval} @@ -15064,7 +14170,6 @@ export interface ExternalPaymentScheduleBase { * @export * @interface ExternalPaymentScheduleGet */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentScheduleGet { /** * @@ -15102,7 +14207,6 @@ export interface ExternalPaymentScheduleGet { * @export * @interface ExternalPaymentScheduleRequest */ -// Edited by Plaid, line 9. any to unknown export interface ExternalPaymentScheduleRequest { /** * @@ -15154,7 +14258,6 @@ export enum FDXContentTypes { * @export * @interface FDXFiAttribute */ -// Edited by Plaid, line 9. any to unknown export interface FDXFiAttribute { /** * Name of attribute @@ -15174,7 +14277,6 @@ export interface FDXFiAttribute { * @export * @interface FDXHateoasLink */ -// Edited by Plaid, line 9. any to unknown export interface FDXHateoasLink { /** * URL to invoke the action on the resource @@ -15219,7 +14321,6 @@ export enum FDXHateoasLinkAction { * @export * @interface FDXInitiatorFiAttribute */ -// Edited by Plaid, line 9. any to unknown export interface FDXInitiatorFiAttribute { /** * @@ -15239,7 +14340,6 @@ export interface FDXInitiatorFiAttribute { * @export * @interface FDXNotification */ -// Edited by Plaid, line 9. any to unknown export interface FDXNotification { /** * Id of notification @@ -15320,7 +14420,6 @@ export enum FDXNotificationCategory { * @export * @interface FDXNotificationPayload */ -// Edited by Plaid, line 9. any to unknown export interface FDXNotificationPayload { /** * ID for the origination entity related to the notification @@ -15397,7 +14496,6 @@ export enum FDXNotificationType { * @export * @interface FDXParty */ -// Edited by Plaid, line 9. any to unknown export interface FDXParty { /** * Human recognizable common name @@ -15473,10 +14571,7 @@ export enum FDXPartyType { * @export * @interface FallbackAuthMicrodepositAutoVerifiedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface FallbackAuthMicrodepositAutoVerifiedWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -15519,10 +14614,7 @@ export interface FallbackAuthMicrodepositAutoVerifiedWebhook { * @export * @interface FallbackAuthMicrodepositVerificationExpiredWebhook */ -// Edited by Plaid, line 9. any to unknown export interface FallbackAuthMicrodepositVerificationExpiredWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -15565,7 +14657,6 @@ export interface FallbackAuthMicrodepositVerificationExpiredWebhook { * @export * @interface FinancialInstitutionInsights */ -// Edited by Plaid, line 9. any to unknown export interface FinancialInstitutionInsights { /** * Name of the financial institution counterparty. @@ -15608,10 +14699,7 @@ export enum Form1099Type { * @export * @interface FraudAmount */ -// Edited by Plaid, line 9. any to unknown export interface FraudAmount { - [key: string]: object | unknown; - /** * * @type {ISOCurrencyCode} @@ -15630,10 +14718,7 @@ export interface FraudAmount { * @export * @interface GenericScreeningHitLocationItems */ -// Edited by Plaid, line 9. any to unknown export interface GenericScreeningHitLocationItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -15652,10 +14737,7 @@ export interface GenericScreeningHitLocationItems { * @export * @interface HealthIncident */ -// Edited by Plaid, line 9. any to unknown export interface HealthIncident { - [key: string]: object | unknown; - /** * The start date of the incident, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format, e.g. `\"2020-10-30T15:26:48Z\"`. * @type {string} @@ -15686,10 +14768,7 @@ export interface HealthIncident { * @export * @interface HistoricalBalance */ -// Edited by Plaid, line 9. any to unknown export interface HistoricalBalance { - [key: string]: object | unknown; - /** * The date of the calculated historical balance, in an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD) * @type {string} @@ -15720,10 +14799,7 @@ export interface HistoricalBalance { * @export * @interface HistoricalUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface HistoricalUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -15766,10 +14842,7 @@ export interface HistoricalUpdateWebhook { * @export * @interface Holding */ -// Edited by Plaid, line 9. any to unknown export interface Holding { - [key: string]: object | unknown; - /** * The Plaid `account_id` associated with the holding. * @type {string} @@ -15836,10 +14909,7 @@ export interface Holding { * @export * @interface HoldingsDefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface HoldingsDefaultUpdateWebhook { - [key: string]: object | unknown; - /** * `HOLDINGS` * @type {string} @@ -15888,7 +14958,6 @@ export interface HoldingsDefaultUpdateWebhook { * @export * @interface HoldingsOverride */ -// Edited by Plaid, line 9. any to unknown export interface HoldingsOverride { /** * The last price given by the institution for this security @@ -15942,10 +15011,7 @@ export enum HostedLinkDeliveryMethod { * @export * @interface HostedMMDVerificationWebhook */ -// Edited by Plaid, line 9. any to unknown export interface HostedMMDVerificationWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -16040,10 +15106,7 @@ export enum ISOCurrencyCode { * @export * @interface IdentityDefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IdentityDefaultUpdateWebhook { - [key: string]: object | unknown; - /** * `IDENTITY` * @type {string} @@ -16086,7 +15149,6 @@ export interface IdentityDefaultUpdateWebhook { * @export * @interface IdentityDocument */ -// Edited by Plaid, line 9. any to unknown export interface IdentityDocument { /** * @@ -16106,10 +15168,7 @@ export interface IdentityDocument { * @export * @interface IdentityDocumentMetadata */ -// Edited by Plaid, line 9. any to unknown export interface IdentityDocumentMetadata { - [key: string]: object | unknown; - /** * The name of the document. * @type {string} @@ -16152,7 +15211,6 @@ export interface IdentityDocumentMetadata { * @export * @interface IdentityGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -16184,7 +15242,6 @@ export interface IdentityGetRequest { * @export * @interface IdentityGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface IdentityGetRequestOptions { /** * A list of `account_ids` to retrieve for the Item. Note: An error will be returned if a provided `account_id` is not associated with the Item. @@ -16198,10 +15255,7 @@ export interface IdentityGetRequestOptions { * @export * @interface IdentityGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityGetResponse { - [key: string]: object | unknown; - /** * The accounts for which Identity data has been requested * @type {Array} @@ -16226,7 +15280,6 @@ export interface IdentityGetResponse { * @export * @interface IdentityMatchRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityMatchRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -16264,7 +15317,6 @@ export interface IdentityMatchRequest { * @export * @interface IdentityMatchRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface IdentityMatchRequestOptions { /** * An array of `account_ids` to perform fuzzy match @@ -16278,10 +15330,7 @@ export interface IdentityMatchRequestOptions { * @export * @interface IdentityMatchResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityMatchResponse { - [key: string]: object | unknown; - /** * The accounts for which Identity match has been requested * @type {Array} @@ -16306,10 +15355,7 @@ export interface IdentityMatchResponse { * @export * @interface IdentityMatchUser */ -// Edited by Plaid, line 9. any to unknown export interface IdentityMatchUser { - [key: string]: object | unknown; - /** * The user\'s full legal name. * @type {string} @@ -16340,7 +15386,6 @@ export interface IdentityMatchUser { * @export * @interface IdentityRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -16366,10 +15411,7 @@ export interface IdentityRefreshRequest { * @export * @interface IdentityRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -16394,10 +15436,7 @@ export enum IdentityUpdateTypes { * @export * @interface IdentityVerification */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerification { - [key: string]: object | unknown; - /** * ID of the associated Identity Verification attempt. * @type {string} @@ -16500,10 +15539,7 @@ export interface IdentityVerification { * @export * @interface IdentityVerificationAutofillAddress */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationAutofillAddress { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -16558,7 +15594,6 @@ export interface IdentityVerificationAutofillAddress { * @export * @interface IdentityVerificationAutofillCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationAutofillCreateRequest { /** * ID of the associated Identity Verification attempt. @@ -16584,10 +15619,7 @@ export interface IdentityVerificationAutofillCreateRequest { * @export * @interface IdentityVerificationAutofillCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationAutofillCreateResponse { - [key: string]: object | unknown; - /** * * @type {IdentityVerificationAutofillStatus} @@ -16622,10 +15654,7 @@ export enum IdentityVerificationAutofillStatus { * @export * @interface IdentityVerificationAutofillUserData */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationAutofillUserData { - [key: string]: object | unknown; - /** * * @type {IdentityVerificationResponseUserName} @@ -16650,7 +15679,6 @@ export interface IdentityVerificationAutofillUserData { * @export * @interface IdentityVerificationCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationCreateRequest { /** * A unique ID that identifies the end user in your system. This ID can also be used to associate user-specific data from other Plaid products. Financial Account Matching requires this field and the `/link/token/create` `client_user_id` to be consistent. Personally identifiable information, such as an email address or phone number, should not be used in the `client_user_id`. @@ -16706,7 +15734,6 @@ export interface IdentityVerificationCreateRequest { * @export * @interface IdentityVerificationCreateRequestUser */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationCreateRequestUser { /** * A valid email address. @@ -16757,10 +15784,7 @@ export interface IdentityVerificationCreateRequestUser { * @export * @interface IdentityVerificationCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated Identity Verification attempt. * @type {string} @@ -16869,10 +15893,7 @@ export interface IdentityVerificationCreateResponse { * @export * @interface IdentityVerificationDocumentAddressResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationDocumentAddressResponse { - [key: string]: object | unknown; - /** * The full street address extracted from the document. * @type {string} @@ -16909,7 +15930,6 @@ export interface IdentityVerificationDocumentAddressResponse { * @export * @interface IdentityVerificationGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationGetRequest { /** * ID of the associated Identity Verification attempt. @@ -16935,10 +15955,7 @@ export interface IdentityVerificationGetRequest { * @export * @interface IdentityVerificationGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationGetResponse { - [key: string]: object | unknown; - /** * ID of the associated Identity Verification attempt. * @type {string} @@ -17047,7 +16064,6 @@ export interface IdentityVerificationGetResponse { * @export * @interface IdentityVerificationListRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -17085,10 +16101,7 @@ export interface IdentityVerificationListRequest { * @export * @interface IdentityVerificationListResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationListResponse { - [key: string]: object | unknown; - /** * List of Plaid sessions * @type {Array} @@ -17113,10 +16126,7 @@ export interface IdentityVerificationListResponse { * @export * @interface IdentityVerificationRequestUser */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRequestUser { - [key: string]: object | unknown; - /** * A valid email address. * @type {string} @@ -17159,7 +16169,6 @@ export interface IdentityVerificationRequestUser { * @export * @interface IdentityVerificationRequestUserName */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRequestUserName { /** * A string with at least one non-whitespace character, with a max length of 100 characters. @@ -17179,10 +16188,7 @@ export interface IdentityVerificationRequestUserName { * @export * @interface IdentityVerificationResponseUserName */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationResponseUserName { - [key: string]: object | unknown; - /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -17201,10 +16207,7 @@ export interface IdentityVerificationResponseUserName { * @export * @interface IdentityVerificationRetriedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRetriedWebhook { - [key: string]: object | unknown; - /** * `IDENTITY_VERIFICATION` * @type {string} @@ -17235,7 +16238,6 @@ export interface IdentityVerificationRetriedWebhook { * @export * @interface IdentityVerificationRetryRequest */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRetryRequest { /** * A unique ID that identifies the end user in your system. This ID can also be used to associate user-specific data from other Plaid products. Financial Account Matching requires this field and the `/link/token/create` `client_user_id` to be consistent. Personally identifiable information, such as an email address or phone number, should not be used in the `client_user_id`. @@ -17285,7 +16287,6 @@ export interface IdentityVerificationRetryRequest { * @export * @interface IdentityVerificationRetryRequestStepsObject */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRetryRequestStepsObject { /** * A boolean field specifying whether the new session should require or skip the `verify_sms` step. @@ -17317,10 +16318,7 @@ export interface IdentityVerificationRetryRequestStepsObject { * @export * @interface IdentityVerificationRetryResponse */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationRetryResponse { - [key: string]: object | unknown; - /** * ID of the associated Identity Verification attempt. * @type {string} @@ -17443,10 +16441,7 @@ export enum IdentityVerificationStatus { * @export * @interface IdentityVerificationStatusUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationStatusUpdatedWebhook { - [key: string]: object | unknown; - /** * `IDENTITY_VERIFICATION` * @type {string} @@ -17496,10 +16491,7 @@ export enum IdentityVerificationStepStatus { * @export * @interface IdentityVerificationStepSummary */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationStepSummary { - [key: string]: object | unknown; - /** * * @type {IdentityVerificationStepStatus} @@ -17548,10 +16540,7 @@ export interface IdentityVerificationStepSummary { * @export * @interface IdentityVerificationStepUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationStepUpdatedWebhook { - [key: string]: object | unknown; - /** * `IDENTITY_VERIFICATION` * @type {string} @@ -17582,10 +16571,7 @@ export interface IdentityVerificationStepUpdatedWebhook { * @export * @interface IdentityVerificationTemplateReference */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationTemplateReference { - [key: string]: object | unknown; - /** * ID of the associated Identity Verification template. * @type {string} @@ -17604,10 +16590,7 @@ export interface IdentityVerificationTemplateReference { * @export * @interface IdentityVerificationUserAddress */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationUserAddress { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -17650,10 +16633,7 @@ export interface IdentityVerificationUserAddress { * @export * @interface IdentityVerificationUserData */ -// Edited by Plaid, line 9. any to unknown export interface IdentityVerificationUserData { - [key: string]: object | unknown; - /** * A phone number in E.164 format. * @type {string} @@ -17713,10 +16693,7 @@ export enum ImageQuality { * @export * @interface IncidentUpdate */ -// Edited by Plaid, line 9. any to unknown export interface IncidentUpdate { - [key: string]: object | unknown; - /** * The content of the update. * @type {string} @@ -17754,10 +16731,7 @@ export enum IncidentUpdateStatusEnum { * @export * @interface IncomeBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface IncomeBreakdown { - [key: string]: object | unknown; - /** * * @type {IncomeBreakdownType} @@ -17800,7 +16774,6 @@ export enum IncomeBreakdownType { * @export * @interface IncomeOverride */ -// Edited by Plaid, line 9. any to unknown export interface IncomeOverride { /** * A list of paystubs associated with the account. @@ -17814,10 +16787,7 @@ export interface IncomeOverride { * @export * @interface IncomeSummary */ -// Edited by Plaid, line 9. any to unknown export interface IncomeSummary { - [key: string]: object | unknown; - /** * * @type {EmployerIncomeSummaryFieldString} @@ -17866,10 +16836,7 @@ export interface IncomeSummary { * @export * @interface IncomeSummaryFieldNumber */ -// Edited by Plaid, line 9. any to unknown export interface IncomeSummaryFieldNumber { - [key: string]: object | unknown; - /** * The value of the field. * @type {number} @@ -17888,10 +16855,7 @@ export interface IncomeSummaryFieldNumber { * @export * @interface IncomeSummaryFieldString */ -// Edited by Plaid, line 9. any to unknown export interface IncomeSummaryFieldString { - [key: string]: object | unknown; - /** * The value of the field. * @type {string} @@ -17910,7 +16874,6 @@ export interface IncomeSummaryFieldString { * @export * @interface IncomeVerificationCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -17948,7 +16911,6 @@ export interface IncomeVerificationCreateRequest { * @export * @interface IncomeVerificationCreateRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationCreateRequestOptions { /** * An array of access tokens corresponding to the Items that will be cross-referenced with the product data. Plaid will attempt to correlate transaction history from these Items with data from the user\'s paystub, such as date and amount. If the `transactions` product was not initialized for the Items during Link, it will be initialized after this Link session. @@ -17962,10 +16924,7 @@ export interface IncomeVerificationCreateRequestOptions { * @export * @interface IncomeVerificationCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationCreateResponse { - [key: string]: object | unknown; - /** * ID of the verification. This ID is persisted throughout the lifetime of the verification. * @type {string} @@ -17994,7 +16953,6 @@ export enum IncomeVerificationDocParsingConfig { * @export * @interface IncomeVerificationDocumentsDownloadRequest */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationDocumentsDownloadRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -18043,7 +17001,6 @@ export enum IncomeVerificationPayrollFlowType { * @export * @interface IncomeVerificationPaystubsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPaystubsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -18076,10 +17033,7 @@ export interface IncomeVerificationPaystubsGetRequest { * @export * @interface IncomeVerificationPaystubsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPaystubsGetResponse { - [key: string]: object | unknown; - /** * Metadata for an income document. * @type {Array} @@ -18121,7 +17075,6 @@ export enum IncomeVerificationPrecheckConfidence { * @export * @interface IncomeVerificationPrecheckEmployer */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckEmployer { /** * The employer\'s name @@ -18153,7 +17106,6 @@ export interface IncomeVerificationPrecheckEmployer { * @export * @interface IncomeVerificationPrecheckEmployerAddress */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckEmployerAddress { /** * The full city name @@ -18191,10 +17143,7 @@ export interface IncomeVerificationPrecheckEmployerAddress { * @export * @interface IncomeVerificationPrecheckEmployerAddressData */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckEmployerAddressData { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -18231,7 +17180,6 @@ export interface IncomeVerificationPrecheckEmployerAddressData { * @export * @interface IncomeVerificationPrecheckMilitaryInfo */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckMilitaryInfo { /** * Is the user currently active duty in the US military @@ -18251,7 +17199,6 @@ export interface IncomeVerificationPrecheckMilitaryInfo { * @export * @interface IncomeVerificationPrecheckPayrollInstitution */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckPayrollInstitution { /** * The name of payroll institution @@ -18265,7 +17212,6 @@ export interface IncomeVerificationPrecheckPayrollInstitution { * @export * @interface IncomeVerificationPrecheckRequest */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -18322,10 +17268,7 @@ export interface IncomeVerificationPrecheckRequest { * @export * @interface IncomeVerificationPrecheckResponse */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckResponse { - [key: string]: object | unknown; - /** * ID of the precheck. Provide this value when calling `/link/token/create` in order to optimize Link conversion. * @type {string} @@ -18350,7 +17293,6 @@ export interface IncomeVerificationPrecheckResponse { * @export * @interface IncomeVerificationPrecheckUser */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationPrecheckUser { /** * The user\'s first name @@ -18382,10 +17324,7 @@ export interface IncomeVerificationPrecheckUser { * @export * @interface IncomeVerificationRefreshReconnectNeededWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationRefreshReconnectNeededWebhook { - [key: string]: object | unknown; - /** * `INCOME` * @type {string} @@ -18416,10 +17355,7 @@ export interface IncomeVerificationRefreshReconnectNeededWebhook { * @export * @interface IncomeVerificationRiskSignalsStatusWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationRiskSignalsStatusWebhook { - [key: string]: object | unknown; - /** * `\"INCOME\"` * @type {string} @@ -18472,10 +17408,7 @@ export enum IncomeVerificationSourceType { * @export * @interface IncomeVerificationStatusWebhook */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationStatusWebhook { - [key: string]: object | unknown; - /** * `\"INCOME\"` * @type {string} @@ -18518,7 +17451,6 @@ export interface IncomeVerificationStatusWebhook { * @export * @interface IncomeVerificationTaxformsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationTaxformsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -18551,10 +17483,7 @@ export interface IncomeVerificationTaxformsGetRequest { * @export * @interface IncomeVerificationTaxformsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationTaxformsGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -18585,10 +17514,7 @@ export interface IncomeVerificationTaxformsGetResponse { * @export * @interface IncomeVerificationWebhookStatus */ -// Edited by Plaid, line 9. any to unknown export interface IncomeVerificationWebhookStatus { - [key: string]: object | unknown; - /** * * @type {string} @@ -18601,10 +17527,7 @@ export interface IncomeVerificationWebhookStatus { * @export * @interface IndividualName */ -// Edited by Plaid, line 9. any to unknown export interface IndividualName { - [key: string]: object | unknown; - /** * The first name of the individual represented by the parent object. * @type {string} @@ -18623,10 +17546,7 @@ export interface IndividualName { * @export * @interface IndividualScreeningHitNames */ -// Edited by Plaid, line 9. any to unknown export interface IndividualScreeningHitNames { - [key: string]: object | unknown; - /** * The full name of the individual, including all parts. * @type {string} @@ -18683,10 +17603,7 @@ export enum IndividualWatchlistCode { * @export * @interface IndividualWatchlistProgram */ -// Edited by Plaid, line 9. any to unknown export interface IndividualWatchlistProgram { - [key: string]: object | unknown; - /** * ID of the associated program. * @type {string} @@ -18741,10 +17658,7 @@ export interface IndividualWatchlistProgram { * @export * @interface InflowModel */ -// Edited by Plaid, line 9. any to unknown export interface InflowModel { - [key: string]: object | unknown; - /** * Inflow model. One of the following: `none`: No income `monthly-income`: Income occurs once per month `monthly-balance-payment`: Pays off the balance on a liability account at the given statement day of month. `monthly-interest-only-payment`: Makes an interest-only payment on a liability account at the given statement day of month. Note that account types supported by Liabilities will accrue interest in the Sandbox. The types impacted are account type `credit` with subtype `credit` or `paypal`, and account type `loan` with subtype `student` or `mortgage`. * @type {string} @@ -18781,10 +17695,7 @@ export interface InflowModel { * @export * @interface InitialUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface InitialUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -18827,10 +17738,7 @@ export interface InitialUpdateWebhook { * @export * @interface Institution */ -// Edited by Plaid, line 9. any to unknown export interface Institution { - [key: string]: object | unknown; - /** * Unique identifier for the institution. Note that the same institution may have multiple records, each with different institution IDs; for example, if the institution has migrated to OAuth, there may be separate `institution_id`s for the OAuth and non-OAuth versions of the institution. Institutions that operate in different countries or with multiple login portals may also have separate `institution_id`s for each country or portal. * @type {string} @@ -18915,10 +17823,7 @@ export interface Institution { * @export * @interface InstitutionStatus */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionStatus { - [key: string]: object | unknown; - /** * * @type {ProductStatus} @@ -18979,10 +17884,7 @@ export interface InstitutionStatus { * @export * @interface InstitutionStatusAlertWebhook */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionStatusAlertWebhook { - [key: string]: object | unknown; - /** * `DASHBOARD_CONFIGURED_ALERT` * @type {string} @@ -19019,10 +17921,7 @@ export interface InstitutionStatusAlertWebhook { * @export * @interface InstitutionSupportedNetworks */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionSupportedNetworks { - [key: string]: object | unknown; - /** * * @type {TransferCapabilitiesGetRTP} @@ -19035,7 +17934,6 @@ export interface InstitutionSupportedNetworks { * @export * @interface InstitutionsGetByIdRequest */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetByIdRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -19073,7 +17971,6 @@ export interface InstitutionsGetByIdRequest { * @export * @interface InstitutionsGetByIdRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetByIdRequestOptions { /** * When `true`, return an institution\'s logo, brand color, and URL. When available, the bank\'s logo is returned as a base64 encoded 152x152 PNG, the brand color is in hexadecimal format. The default value is `false`. Note that Plaid does not own any of the logos shared by the API and that by accessing or using these logos, you agree that you are doing so at your own risk and will, if necessary, obtain all required permissions from the appropriate rights holders and adhere to any applicable usage guidelines. Plaid disclaims all express or implied warranties with respect to the logos. @@ -19105,10 +18002,7 @@ export interface InstitutionsGetByIdRequestOptions { * @export * @interface InstitutionsGetByIdResponse */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetByIdResponse { - [key: string]: object | unknown; - /** * * @type {Institution} @@ -19127,7 +18021,6 @@ export interface InstitutionsGetByIdResponse { * @export * @interface InstitutionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -19171,7 +18064,6 @@ export interface InstitutionsGetRequest { * @export * @interface InstitutionsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetRequestOptions { /** * Filter the Institutions based on which products they support. @@ -19215,10 +18107,7 @@ export interface InstitutionsGetRequestOptions { * @export * @interface InstitutionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsGetResponse { - [key: string]: object | unknown; - /** * A list of Plaid institutions * @type {Array} @@ -19243,10 +18132,7 @@ export interface InstitutionsGetResponse { * @export * @interface InstitutionsSearchAccountFilter */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsSearchAccountFilter { - [key: string]: object | unknown; - /** * * @type {Array} @@ -19277,7 +18163,6 @@ export interface InstitutionsSearchAccountFilter { * @export * @interface InstitutionsSearchPaymentInitiationOptions */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsSearchPaymentInitiationOptions { /** * A unique ID identifying the payment @@ -19297,7 +18182,6 @@ export interface InstitutionsSearchPaymentInitiationOptions { * @export * @interface InstitutionsSearchRequest */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsSearchRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -19341,7 +18225,6 @@ export interface InstitutionsSearchRequest { * @export * @interface InstitutionsSearchRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsSearchRequestOptions { /** * Limit results to institutions with or without OAuth login flows. Note that institutions will have `oauth` set to `true` if some Items associated with that institution are required to use OAuth flows; institutions in a state of migration to OAuth will have the `oauth` attribute set to `true`. @@ -19379,10 +18262,7 @@ export interface InstitutionsSearchRequestOptions { * @export * @interface InstitutionsSearchResponse */ -// Edited by Plaid, line 9. any to unknown export interface InstitutionsSearchResponse { - [key: string]: object | unknown; - /** * An array of institutions matching the search criteria * @type {Array} @@ -19459,10 +18339,7 @@ export enum InvestmentAccountSubtype { * @export * @interface InvestmentFilter */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentFilter { - [key: string]: object | unknown; - /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -19475,7 +18352,6 @@ export interface InvestmentFilter { * @export * @interface InvestmentHoldingsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentHoldingsGetRequestOptions { /** * An array of `account_id`s to retrieve for the Item. An error will be returned if a provided `account_id` is not associated with the Item. @@ -19489,10 +18365,7 @@ export interface InvestmentHoldingsGetRequestOptions { * @export * @interface InvestmentTransaction */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentTransaction { - [key: string]: object | unknown; - /** * The ID of the Investment transaction, unique across all Plaid transactions. Like all Plaid identifiers, the `investment_transaction_id` is case sensitive. * @type {string} @@ -19654,10 +18527,7 @@ export enum InvestmentTransactionType { * @export * @interface InvestmentsAuthGetNumbers */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsAuthGetNumbers { - [key: string]: object | unknown; - /** * * @type {Array} @@ -19676,7 +18546,6 @@ export interface InvestmentsAuthGetNumbers { * @export * @interface InvestmentsAuthGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsAuthGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -19708,7 +18577,6 @@ export interface InvestmentsAuthGetRequest { * @export * @interface InvestmentsAuthGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsAuthGetRequestOptions { /** * An array of `account_id`s to retrieve for the Item. An error will be returned if a provided `account_id` is not associated with the Item. @@ -19722,10 +18590,7 @@ export interface InvestmentsAuthGetRequestOptions { * @export * @interface InvestmentsAuthGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsAuthGetResponse { - [key: string]: object | unknown; - /** * The accounts for which data is being retrieved * @type {Array} @@ -19774,10 +18639,7 @@ export interface InvestmentsAuthGetResponse { * @export * @interface InvestmentsAuthOwner */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsAuthOwner { - [key: string]: object | unknown; - /** * The ID of the account that this identity information pertains to * @type {string} @@ -19796,10 +18658,7 @@ export interface InvestmentsAuthOwner { * @export * @interface InvestmentsDefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsDefaultUpdateWebhook { - [key: string]: object | unknown; - /** * `INVESTMENTS_TRANSACTIONS` * @type {string} @@ -19848,10 +18707,7 @@ export interface InvestmentsDefaultUpdateWebhook { * @export * @interface InvestmentsHistoricalUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsHistoricalUpdateWebhook { - [key: string]: object | unknown; - /** * `INVESTMENTS_TRANSACTIONS` * @type {string} @@ -19900,7 +18756,6 @@ export interface InvestmentsHistoricalUpdateWebhook { * @export * @interface InvestmentsHoldingsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsHoldingsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -19932,10 +18787,7 @@ export interface InvestmentsHoldingsGetRequest { * @export * @interface InvestmentsHoldingsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsHoldingsGetResponse { - [key: string]: object | unknown; - /** * The accounts associated with the Item * @type {Array} @@ -19978,7 +18830,6 @@ export interface InvestmentsHoldingsGetResponse { * @export * @interface InvestmentsRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20004,10 +18855,7 @@ export interface InvestmentsRefreshRequest { * @export * @interface InvestmentsRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20020,7 +18868,6 @@ export interface InvestmentsRefreshResponse { * @export * @interface InvestmentsTransactionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsTransactionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20064,7 +18911,6 @@ export interface InvestmentsTransactionsGetRequest { * @export * @interface InvestmentsTransactionsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsTransactionsGetRequestOptions { /** * An array of `account_ids` to retrieve for the Item. @@ -20096,10 +18942,7 @@ export interface InvestmentsTransactionsGetRequestOptions { * @export * @interface InvestmentsTransactionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsTransactionsGetResponse { - [key: string]: object | unknown; - /** * * @type {Item} @@ -20148,7 +18991,6 @@ export interface InvestmentsTransactionsGetResponse { * @export * @interface InvestmentsTransactionsOverride */ -// Edited by Plaid, line 9. any to unknown export interface InvestmentsTransactionsOverride { /** * Posting date for the transaction. Must be formatted as an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) date. @@ -20214,10 +19056,7 @@ export enum IssuingCountry { * @export * @interface Item */ -// Edited by Plaid, line 9. any to unknown export interface Item { - [key: string]: object | unknown; - /** * The Plaid Item ID. The `item_id` is always unique; linking the same account at the same institution twice will result in two Items with different `item_id` values. Like all Plaid identifiers, the `item_id` is case-sensitive. * @type {string} @@ -20294,7 +19133,6 @@ export enum ItemUpdateTypeEnum { * @export * @interface ItemAccessTokenInvalidateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemAccessTokenInvalidateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20320,10 +19158,7 @@ export interface ItemAccessTokenInvalidateRequest { * @export * @interface ItemAccessTokenInvalidateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemAccessTokenInvalidateResponse { - [key: string]: object | unknown; - /** * The access token associated with the Item data is being requested for. * @type {string} @@ -20342,7 +19177,6 @@ export interface ItemAccessTokenInvalidateResponse { * @export * @interface ItemActivityListRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemActivityListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20380,10 +19214,7 @@ export interface ItemActivityListRequest { * @export * @interface ItemActivityListResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemActivityListResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20414,7 +19245,6 @@ export interface ItemActivityListResponse { * @export * @interface ItemApplicationListRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20440,10 +19270,7 @@ export interface ItemApplicationListRequest { * @export * @interface ItemApplicationListResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationListResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20462,7 +19289,6 @@ export interface ItemApplicationListResponse { * @export * @interface ItemApplicationListUserAuth */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationListUserAuth { /** * Account username. @@ -20482,7 +19308,6 @@ export interface ItemApplicationListUserAuth { * @export * @interface ItemApplicationScopesUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationScopesUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20532,10 +19357,7 @@ export interface ItemApplicationScopesUpdateRequest { * @export * @interface ItemApplicationScopesUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationScopesUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20548,7 +19370,6 @@ export interface ItemApplicationScopesUpdateResponse { * @export * @interface ItemApplicationUnlinkRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationUnlinkRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20580,10 +19401,7 @@ export interface ItemApplicationUnlinkRequest { * @export * @interface ItemApplicationUnlinkResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemApplicationUnlinkResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20596,10 +19414,7 @@ export interface ItemApplicationUnlinkResponse { * @export * @interface ItemErrorWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ItemErrorWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -20636,7 +19451,6 @@ export interface ItemErrorWebhook { * @export * @interface ItemGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20662,10 +19476,7 @@ export interface ItemGetRequest { * @export * @interface ItemGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemGetResponse { - [key: string]: object | unknown; - /** * * @type {Item} @@ -20690,7 +19501,6 @@ export interface ItemGetResponse { * @export * @interface ItemImportRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemImportRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20728,7 +19538,6 @@ export interface ItemImportRequest { * @export * @interface ItemImportRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface ItemImportRequestOptions { /** * Specifies a webhook URL to associate with an Item. Plaid fires a webhook if credentials fail. @@ -20742,7 +19551,6 @@ export interface ItemImportRequestOptions { * @export * @interface ItemImportRequestUserAuth */ -// Edited by Plaid, line 9. any to unknown export interface ItemImportRequestUserAuth { /** * Opaque user identifier @@ -20762,10 +19570,7 @@ export interface ItemImportRequestUserAuth { * @export * @interface ItemImportResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemImportResponse { - [key: string]: object | unknown; - /** * The access token associated with the Item data is being requested for. * @type {string} @@ -20784,10 +19589,7 @@ export interface ItemImportResponse { * @export * @interface ItemLoginRepairedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ItemLoginRepairedWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -20818,10 +19620,7 @@ export interface ItemLoginRepairedWebhook { * @export * @interface ItemProductReadyWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ItemProductReadyWebhook { - [key: string]: object | unknown; - /** * `INCOME` * @type {string} @@ -20858,7 +19657,6 @@ export interface ItemProductReadyWebhook { * @export * @interface ItemPublicTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemPublicTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20884,10 +19682,7 @@ export interface ItemPublicTokenCreateRequest { * @export * @interface ItemPublicTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemPublicTokenCreateResponse { - [key: string]: object | unknown; - /** * A `public_token` for the particular Item corresponding to the specified `access_token` * @type {string} @@ -20912,7 +19707,6 @@ export interface ItemPublicTokenCreateResponse { * @export * @interface ItemPublicTokenExchangeRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemPublicTokenExchangeRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20938,10 +19732,7 @@ export interface ItemPublicTokenExchangeRequest { * @export * @interface ItemPublicTokenExchangeResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemPublicTokenExchangeResponse { - [key: string]: object | unknown; - /** * The access token associated with the Item data is being requested for. * @type {string} @@ -20966,7 +19757,6 @@ export interface ItemPublicTokenExchangeResponse { * @export * @interface ItemRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -20992,10 +19782,7 @@ export interface ItemRemoveRequest { * @export * @interface ItemRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemRemoveResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -21008,10 +19795,7 @@ export interface ItemRemoveResponse { * @export * @interface ItemStatus */ -// Edited by Plaid, line 9. any to unknown export interface ItemStatus { - [key: string]: object | unknown; - /** * * @type {ItemStatusInvestments} @@ -21036,10 +19820,7 @@ export interface ItemStatus { * @export * @interface ItemStatusInvestments */ -// Edited by Plaid, line 9. any to unknown export interface ItemStatusInvestments { - [key: string]: object | unknown; - /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of the last successful investments update for the Item. The status will update each time Plaid successfully connects with the institution, regardless of whether any new data is available in the update. * @type {string} @@ -21058,10 +19839,7 @@ export interface ItemStatusInvestments { * @export * @interface ItemStatusLastWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ItemStatusLastWebhook { - [key: string]: object | unknown; - /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of when the webhook was fired. * @type {string} @@ -21080,7 +19858,6 @@ export interface ItemStatusLastWebhook { * @export * @interface ItemStatusNullable */ -// Edited by Plaid, line 9. any to unknown export interface ItemStatusNullable { /** * @@ -21106,10 +19883,7 @@ export interface ItemStatusNullable { * @export * @interface ItemStatusTransactions */ -// Edited by Plaid, line 9. any to unknown export interface ItemStatusTransactions { - [key: string]: object | unknown; - /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of the last successful transactions update for the Item. The status will update each time Plaid successfully connects with the institution, regardless of whether any new data is available in the update. * @type {string} @@ -21128,7 +19902,6 @@ export interface ItemStatusTransactions { * @export * @interface ItemWebhookUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ItemWebhookUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -21160,10 +19933,7 @@ export interface ItemWebhookUpdateRequest { * @export * @interface ItemWebhookUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ItemWebhookUpdateResponse { - [key: string]: object | unknown; - /** * * @type {Item} @@ -21182,10 +19952,7 @@ export interface ItemWebhookUpdateResponse { * @export * @interface JWKPublicKey */ -// Edited by Plaid, line 9. any to unknown export interface JWKPublicKey { - [key: string]: object | unknown; - /** * The alg member identifies the cryptographic algorithm family used with the key. * @type {string} @@ -21246,10 +20013,7 @@ export interface JWKPublicKey { * @export * @interface JWTHeader */ -// Edited by Plaid, line 9. any to unknown export interface JWTHeader { - [key: string]: object | unknown; - /** * * @type {string} @@ -21262,10 +20026,7 @@ export interface JWTHeader { * @export * @interface KYCCheckAddressSummary */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckAddressSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -21290,10 +20051,7 @@ export interface KYCCheckAddressSummary { * @export * @interface KYCCheckDateOfBirthSummary */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckDateOfBirthSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -21306,10 +20064,7 @@ export interface KYCCheckDateOfBirthSummary { * @export * @interface KYCCheckDetails */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckDetails { - [key: string]: object | unknown; - /** * The outcome status for the associated Identity Verification attempt\'s `kyc_check` step. This field will always have the same value as `steps.kyc_check`. * @type {string} @@ -21352,10 +20107,7 @@ export interface KYCCheckDetails { * @export * @interface KYCCheckIDNumberSummary */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckIDNumberSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -21368,10 +20120,7 @@ export interface KYCCheckIDNumberSummary { * @export * @interface KYCCheckNameSummary */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckNameSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -21384,10 +20133,7 @@ export interface KYCCheckNameSummary { * @export * @interface KYCCheckPhoneSummary */ -// Edited by Plaid, line 9. any to unknown export interface KYCCheckPhoneSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -21406,10 +20152,7 @@ export interface KYCCheckPhoneSummary { * @export * @interface LastDataAccessTimes */ -// Edited by Plaid, line 9. any to unknown export interface LastDataAccessTimes { - [key: string]: object | unknown; - /** * ID of the application accessing data. * @type {string} @@ -21470,7 +20213,6 @@ export interface LastDataAccessTimes { * @export * @interface LiabilitiesDefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface LiabilitiesDefaultUpdateWebhook { /** * `LIABILITIES` @@ -21520,7 +20262,6 @@ export interface LiabilitiesDefaultUpdateWebhook { * @export * @interface LiabilitiesGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface LiabilitiesGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -21552,7 +20293,6 @@ export interface LiabilitiesGetRequest { * @export * @interface LiabilitiesGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface LiabilitiesGetRequestOptions { /** * A list of accounts to retrieve for the Item. An error will be returned if a provided `account_id` is not associated with the Item @@ -21566,10 +20306,7 @@ export interface LiabilitiesGetRequestOptions { * @export * @interface LiabilitiesGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface LiabilitiesGetResponse { - [key: string]: object | unknown; - /** * An array of accounts associated with the Item * @type {Array} @@ -21600,10 +20337,7 @@ export interface LiabilitiesGetResponse { * @export * @interface LiabilitiesObject */ -// Edited by Plaid, line 9. any to unknown export interface LiabilitiesObject { - [key: string]: object | unknown; - /** * The credit accounts returned. * @type {Array} @@ -21628,10 +20362,7 @@ export interface LiabilitiesObject { * @export * @interface LiabilityOverride */ -// Edited by Plaid, line 9. any to unknown export interface LiabilityOverride { - [key: string]: object | unknown; - /** * The type of the liability object, either `credit` or `student`. Mortgages are not currently supported in the custom Sandbox. * @type {string} @@ -21782,10 +20513,7 @@ export interface LiabilityOverride { * @export * @interface LinkCallbackMetadata */ -// Edited by Plaid, line 9. any to unknown export interface LinkCallbackMetadata { - [key: string]: object | unknown; - /** * * @type {LinkDeliveryWebhookCallbackType} @@ -21834,10 +20562,7 @@ export interface LinkCallbackMetadata { * @export * @interface LinkDeliveryAccount */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryAccount { - [key: string]: object | unknown; - /** * The Plaid `account_id` * @type {string} @@ -21886,10 +20611,7 @@ export interface LinkDeliveryAccount { * @export * @interface LinkDeliveryCallbackWebhook */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryCallbackWebhook { - [key: string]: object | unknown; - /** * `LINK_DELIVERY` * @type {string} @@ -21932,7 +20654,6 @@ export interface LinkDeliveryCallbackWebhook { * @export * @interface LinkDeliveryCommunicationMethod */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryCommunicationMethod { /** * @@ -21952,7 +20673,6 @@ export interface LinkDeliveryCommunicationMethod { * @export * @interface LinkDeliveryCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -21984,10 +20704,7 @@ export interface LinkDeliveryCreateRequest { * @export * @interface LinkDeliveryCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryCreateResponse { - [key: string]: object | unknown; - /** * The URL to the Hosted Link session, which will be delivered by the specified delivery method. * @type {string} @@ -22022,7 +20739,6 @@ export enum LinkDeliveryDeliveryMethod { * @export * @interface LinkDeliveryGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -22048,10 +20764,7 @@ export interface LinkDeliveryGetRequest { * @export * @interface LinkDeliveryGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryGetResponse { - [key: string]: object | unknown; - /** * * @type {LinkDeliverySessionStatus} @@ -22094,10 +20807,7 @@ export interface LinkDeliveryGetResponse { * @export * @interface LinkDeliveryInstitution */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryInstitution { - [key: string]: object | unknown; - /** * The full institution name, such as \'Wells Fargo\' * @type {string} @@ -22116,10 +20826,7 @@ export interface LinkDeliveryInstitution { * @export * @interface LinkDeliveryMetadata */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryMetadata { - [key: string]: object | unknown; - /** * * @type {LinkDeliveryWebhookCommunicationMethod} @@ -22138,7 +20845,6 @@ export interface LinkDeliveryMetadata { * @export * @interface LinkDeliveryOptions */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryOptions { /** * @@ -22152,7 +20858,6 @@ export interface LinkDeliveryOptions { * @export * @interface LinkDeliveryRecipient */ -// Edited by Plaid, line 9. any to unknown export interface LinkDeliveryRecipient { /** * The list of communication methods to send the Hosted Link session URL to. If delivery is not required, leave this field blank. @@ -22231,10 +20936,7 @@ export enum LinkDeliveryWebhookDeliveryStatus { * @export * @interface LinkEvent */ -// Edited by Plaid, line 9. any to unknown export interface LinkEvent { - [key: string]: object | unknown; - /** * Event name * @type {string} @@ -22259,10 +20961,7 @@ export interface LinkEvent { * @export * @interface LinkEventMetadata */ -// Edited by Plaid, line 9. any to unknown export interface LinkEventMetadata { - [key: string]: object | unknown; - /** * The error code that the user encountered. Emitted by `ERROR`, `EXIT`. * @type {string} @@ -22392,10 +21091,7 @@ export enum LinkEventName { * @export * @interface LinkEventsWebhook */ -// Edited by Plaid, line 9. any to unknown export interface LinkEventsWebhook { - [key: string]: object | unknown; - /** * `LINK` * @type {string} @@ -22432,7 +21128,6 @@ export interface LinkEventsWebhook { * @export * @interface LinkOAuthCorrelationIdExchangeRequest */ -// Edited by Plaid, line 9. any to unknown export interface LinkOAuthCorrelationIdExchangeRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -22458,10 +21153,7 @@ export interface LinkOAuthCorrelationIdExchangeRequest { * @export * @interface LinkOAuthCorrelationIdExchangeResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkOAuthCorrelationIdExchangeResponse { - [key: string]: object | unknown; - /** * The `link_token` associated to the given `link_correlation_id`, which can be used to re-initialize Link. * @type {string} @@ -22480,10 +21172,7 @@ export interface LinkOAuthCorrelationIdExchangeResponse { * @export * @interface LinkSessionExit */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionExit { - [key: string]: object | unknown; - /** * * @type {PlaidError} @@ -22502,7 +21191,6 @@ export interface LinkSessionExit { * @export * @interface LinkSessionExitMetadata */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionExitMetadata { /** * @@ -22534,7 +21222,6 @@ export interface LinkSessionExitMetadata { * @export * @interface LinkSessionExitMetadataInstitution */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionExitMetadataInstitution { /** * The full institution name, such as `Wells Fargo` @@ -22554,10 +21241,7 @@ export interface LinkSessionExitMetadataInstitution { * @export * @interface LinkSessionFinishedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionFinishedWebhook { - [key: string]: object | unknown; - /** * `LINK` * @type {string} @@ -22606,7 +21290,6 @@ export interface LinkSessionFinishedWebhook { * @export * @interface LinkSessionSuccess */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionSuccess { /** * Displayed once a user has successfully linked their Item. @@ -22626,7 +21309,6 @@ export interface LinkSessionSuccess { * @export * @interface LinkSessionSuccessMetadata */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionSuccessMetadata { /** * @@ -22658,7 +21340,6 @@ export interface LinkSessionSuccessMetadata { * @export * @interface LinkSessionSuccessMetadataAccount */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionSuccessMetadataAccount { /** * The Plaid `account_id` @@ -22708,7 +21389,6 @@ export interface LinkSessionSuccessMetadataAccount { * @export * @interface LinkSessionSuccessMetadataInstitution */ -// Edited by Plaid, line 9. any to unknown export interface LinkSessionSuccessMetadataInstitution { /** * The full institution name, such as `\'Wells Fargo\'` @@ -22738,10 +21418,7 @@ export enum LinkSessionSuccessMetadataTransferStatus { * @export * @interface LinkTokenAccountFilters */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenAccountFilters { - [key: string]: object | unknown; - /** * * @type {DepositoryFilter} @@ -22778,7 +21455,6 @@ export interface LinkTokenAccountFilters { * @export * @interface LinkTokenCreateCardSwitch */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateCardSwitch { /** * The BIN (Bank Identification Number) of the card to switch. @@ -22792,7 +21468,6 @@ export interface LinkTokenCreateCardSwitch { * @export * @interface LinkTokenCreateCreditFilter */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateCreditFilter { /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). @@ -22806,7 +21481,6 @@ export interface LinkTokenCreateCreditFilter { * @export * @interface LinkTokenCreateDepositoryFilter */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateDepositoryFilter { /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). @@ -22820,10 +21494,7 @@ export interface LinkTokenCreateDepositoryFilter { * @export * @interface LinkTokenCreateHostedLink */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateHostedLink { - [key: string]: object | unknown; - /** * * @type {HostedLinkDeliveryMethod} @@ -22848,7 +21519,6 @@ export interface LinkTokenCreateHostedLink { * @export * @interface LinkTokenCreateInstitutionData */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateInstitutionData { /** * The routing number of the bank to highlight in Link. Note: in rare cases, a single routing number can be associated with multiple institutions, e.g. due to a brokerage using another institution to manage ACH on its sweep accounts. If this happens, the bank will not be highlighted in Link even if the routing number is provided. @@ -22862,7 +21532,6 @@ export interface LinkTokenCreateInstitutionData { * @export * @interface LinkTokenCreateInvestmentFilter */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateInvestmentFilter { /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). @@ -22876,7 +21545,6 @@ export interface LinkTokenCreateInvestmentFilter { * @export * @interface LinkTokenCreateLoanFilter */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateLoanFilter { /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). @@ -22890,7 +21558,6 @@ export interface LinkTokenCreateLoanFilter { * @export * @interface LinkTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -23126,7 +21793,6 @@ export interface LinkTokenCreateRequest { * @export * @interface LinkTokenCreateRequestAccountSubtypes */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestAccountSubtypes { /** * @@ -23158,7 +21824,6 @@ export interface LinkTokenCreateRequestAccountSubtypes { * @export * @interface LinkTokenCreateRequestAuth */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestAuth { /** * Specifies whether Auth Type Select is enabled for the Link session, allowing the end user to choose between linking instantly or manually prior to selecting their financial institution. Note that this can only be true if `same_day_microdeposits_enabled` is set to true. @@ -23233,7 +21898,6 @@ export enum LinkTokenCreateRequestAuthFlowTypeEnum { * @export * @interface LinkTokenCreateRequestBaseReport */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestBaseReport { /** * The maximum integer number of days of history to include in the Base Report. @@ -23247,7 +21911,6 @@ export interface LinkTokenCreateRequestBaseReport { * @export * @interface LinkTokenCreateRequestDepositSwitch */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestDepositSwitch { /** * The `deposit_switch_id` provided by the `/deposit_switch/create` endpoint. @@ -23261,7 +21924,6 @@ export interface LinkTokenCreateRequestDepositSwitch { * @export * @interface LinkTokenCreateRequestEmployment */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestEmployment { /** * The types of source employment data that users will be permitted to share. Options include `bank` and `payroll`. Currently you can only specify one of these options. @@ -23281,7 +21943,6 @@ export interface LinkTokenCreateRequestEmployment { * @export * @interface LinkTokenCreateRequestEmploymentBankIncome */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestEmploymentBankIncome { /** * The number of days of data to request for the Bank Employment product. @@ -23295,7 +21956,6 @@ export interface LinkTokenCreateRequestEmploymentBankIncome { * @export * @interface LinkTokenCreateRequestIdentityVerification */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestIdentityVerification { /** * @@ -23321,7 +21981,6 @@ export interface LinkTokenCreateRequestIdentityVerification { * @export * @interface LinkTokenCreateRequestIncomeVerification */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestIncomeVerification { /** * The `income_verification_id` of the verification instance, as provided by `/income/verification/create`. @@ -23372,7 +22031,6 @@ export interface LinkTokenCreateRequestIncomeVerification { * @export * @interface LinkTokenCreateRequestIncomeVerificationBankIncome */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestIncomeVerificationBankIncome { /** * The number of days of data to request for the Bank Income product @@ -23392,7 +22050,6 @@ export interface LinkTokenCreateRequestIncomeVerificationBankIncome { * @export * @interface LinkTokenCreateRequestIncomeVerificationPayrollIncome */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestIncomeVerificationPayrollIncome { /** * The types of payroll income verification to enable for the Link session. If none are specified, then users will see both document and digital payroll income. @@ -23424,7 +22081,6 @@ export interface LinkTokenCreateRequestIncomeVerificationPayrollIncome { * @export * @interface LinkTokenCreateRequestPaymentInitiation */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestPaymentInitiation { /** * The `payment_id` provided by the `/payment_initiation/payment/create` endpoint. @@ -23444,7 +22100,6 @@ export interface LinkTokenCreateRequestPaymentInitiation { * @export * @interface LinkTokenCreateRequestStatements */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestStatements { /** * The start date for statements, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) “YYYY-MM-DD” format, e.g. \"2020-10-30\". If no value is provided, this will default to 3 months prior to the current date. @@ -23464,7 +22119,6 @@ export interface LinkTokenCreateRequestStatements { * @export * @interface LinkTokenCreateRequestTransfer */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestTransfer { /** * The `id` returned by the `/transfer/intent/create` endpoint. @@ -23484,7 +22138,6 @@ export interface LinkTokenCreateRequestTransfer { * @export * @interface LinkTokenCreateRequestUpdate */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestUpdate { /** * If `true`, enables [update mode with Account Select](https://plaid.com/docs/link/update-mode/#using-update-mode-to-request-new-accounts) for institutions that do not use OAuth, or that use OAuth but do not have their own account selection flow. For institutions that have an OAuth account selection flow (i.e. most OAuth-enabled institutions), update mode with Account Select will always be enabled, regardless of the value of this field. @@ -23498,7 +22151,6 @@ export interface LinkTokenCreateRequestUpdate { * @export * @interface LinkTokenCreateRequestUser */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestUser { /** * A unique ID representing the end user. Typically this will be a user ID number from your application. Personally identifiable information, such as an email address or phone number, should not be used in the `client_user_id`. It is currently used as a means of searching logs for the given user in the Plaid Dashboard. @@ -23507,7 +22159,7 @@ export interface LinkTokenCreateRequestUser { */ client_user_id: string; /** - * The user\'s full legal name, used for [micro-deposit based verification flows](https://plaid.com/docs/auth/coverage/). For a small number of customers on legacy flows, providing this field is required to enable micro-deposit-based flows. For all other customers, this field is optional, but providing the user\'s name in this field when using micro-deposit-based verification will enable certain risk checks and can reduce micro-deposit fraud. + * The user\'s full legal name, used for [micro-deposit based verification flows](https://plaid.com/docs/auth/coverage/). For a small number of customers on legacy flows, providing this field is required to enable micro-deposit-based flows. For all other customers, this field is optional. Providing the user\'s name in this field when using micro-deposit-based verification will streamline the end user experience, as the user will not be prompted to enter their name during the Link flow; Plaid will use the provided legal name instead. * @type {string} * @memberof LinkTokenCreateRequestUser */ @@ -23575,7 +22227,6 @@ export interface LinkTokenCreateRequestUser { * @export * @interface LinkTokenCreateRequestUserStatedIncomeSource */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateRequestUserStatedIncomeSource { /** * The employer corresponding to an income source specified by the user @@ -23619,10 +22270,7 @@ export interface LinkTokenCreateRequestUserStatedIncomeSource { * @export * @interface LinkTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateResponse { - [key: string]: object | unknown; - /** * A `link_token`, which can be supplied to Link in order to initialize it and receive a `public_token`, which can be exchanged for an `access_token`. * @type {string} @@ -23653,7 +22301,6 @@ export interface LinkTokenCreateResponse { * @export * @interface LinkTokenEUConfig */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenEUConfig { /** * If `true`, open Link without an initial UI. Defaults to `false`. @@ -23667,10 +22314,7 @@ export interface LinkTokenEUConfig { * @export * @interface LinkTokenGetMetadataResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenGetMetadataResponse { - [key: string]: object | unknown; - /** * The `products` specified in the `/link/token/create` call. * @type {Array} @@ -23725,7 +22369,6 @@ export interface LinkTokenGetMetadataResponse { * @export * @interface LinkTokenGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -23751,10 +22394,7 @@ export interface LinkTokenGetRequest { * @export * @interface LinkTokenGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenGetResponse { - [key: string]: object | unknown; - /** * A `link_token`, which can be supplied to Link in order to initialize it and receive a `public_token`, which can be exchanged for an `access_token`. * @type {string} @@ -23797,10 +22437,7 @@ export interface LinkTokenGetResponse { * @export * @interface LinkTokenGetSessionsResponse */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenGetSessionsResponse { - [key: string]: object | unknown; - /** * The unique ID for the link session. * @type {string} @@ -23837,7 +22474,6 @@ export interface LinkTokenGetSessionsResponse { * @export * @interface LinkTokenInvestments */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenInvestments { /** * If `true`, allow self-custody crypto wallets to be added without requiring signature verification. Defaults to `false`. @@ -23857,7 +22493,6 @@ export interface LinkTokenInvestments { * @export * @interface LinkTokenInvestmentsAuth */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenInvestmentsAuth { /** * If `true`, show institutions that use the manual entry fallback flow. @@ -23877,7 +22512,6 @@ export interface LinkTokenInvestmentsAuth { * @export * @interface LinkTokenTransactions */ -// Edited by Plaid, line 9. any to unknown export interface LinkTokenTransactions { /** * The maximum number of days of transaction history to request for the Transactions product. For developer accounts created after December 3, 2023, if no value is specified, this will default to 90 days. For developer accounts created on December 3, 2023 or earlier, if no value is specified, this will default to 730 days until June 24, 2024, at which point it will default to 90 days. We strongly recommend that customers utilizing [Recurring Transactions](https://plaid.com/docs/api/products/transactions/#transactionsrecurringget) request at least 180 days of history for optimal results. @@ -23891,10 +22525,7 @@ export interface LinkTokenTransactions { * @export * @interface LinkUserDeliveryStatusWebhook */ -// Edited by Plaid, line 9. any to unknown export interface LinkUserDeliveryStatusWebhook { - [key: string]: object | unknown; - /** * `LINK_DELIVERY` * @type {string} @@ -23931,10 +22562,7 @@ export interface LinkUserDeliveryStatusWebhook { * @export * @interface Loan */ -// Edited by Plaid, line 9. any to unknown export interface Loan { - [key: string]: object | unknown; - /** * * @type {LoanIdentifiers} @@ -23967,10 +22595,7 @@ export enum LoanAccountSubtype { * @export * @interface LoanFilter */ -// Edited by Plaid, line 9. any to unknown export interface LoanFilter { - [key: string]: object | unknown; - /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -23983,10 +22608,7 @@ export interface LoanFilter { * @export * @interface LoanIdentifier */ -// Edited by Plaid, line 9. any to unknown export interface LoanIdentifier { - [key: string]: object | unknown; - /** * The value of the identifier for the specified type. * @type {string} @@ -24015,10 +22637,7 @@ export enum LoanIdentifierType { * @export * @interface LoanIdentifiers */ -// Edited by Plaid, line 9. any to unknown export interface LoanIdentifiers { - [key: string]: object | unknown; - /** * * @type {LoanIdentifier} @@ -24031,10 +22650,7 @@ export interface LoanIdentifiers { * @export * @interface Loans */ -// Edited by Plaid, line 9. any to unknown export interface Loans { - [key: string]: object | unknown; - /** * * @type {Loan} @@ -24047,10 +22663,7 @@ export interface Loans { * @export * @interface Location */ -// Edited by Plaid, line 9. any to unknown export interface Location { - [key: string]: object | unknown; - /** * The street address where the transaction occurred. * @type {string} @@ -24105,10 +22718,7 @@ export interface Location { * @export * @interface MFA */ -// Edited by Plaid, line 9. any to unknown export interface MFA { - [key: string]: object | unknown; - /** * Possible values are `device`, `selections`, or `questions`. If value is `device`, the MFA answer is `1234`. If value is `selections`, the MFA answer is always the first option. If value is `questions`, the MFA answer is `answer__` for the j-th question in the i-th round, starting from 0. For example, the answer to the first question in the second round is `answer_1_0`. * @type {string} @@ -24145,10 +22755,7 @@ export interface MFA { * @export * @interface MatchSummary */ -// Edited by Plaid, line 9. any to unknown export interface MatchSummary { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -24174,7 +22781,6 @@ export enum MatchSummaryCode { * @export * @interface MerchantInsights */ -// Edited by Plaid, line 9. any to unknown export interface MerchantInsights { /** * The counterparty name. @@ -24230,10 +22836,7 @@ export interface MerchantInsights { * @export * @interface Meta */ -// Edited by Plaid, line 9. any to unknown export interface Meta { - [key: string]: object | unknown; - /** * The account\'s name * @type {string} @@ -24264,10 +22867,7 @@ export interface Meta { * @export * @interface MortgageInterestRate */ -// Edited by Plaid, line 9. any to unknown export interface MortgageInterestRate { - [key: string]: object | unknown; - /** * Percentage value (interest rate of current mortgage, not APR) of interest payable on a loan. * @type {number} @@ -24286,10 +22886,7 @@ export interface MortgageInterestRate { * @export * @interface MortgageLiability */ -// Edited by Plaid, line 9. any to unknown export interface MortgageLiability { - [key: string]: object | unknown; - /** * The ID of the account that this liability belongs to. * @type {string} @@ -24416,10 +23013,7 @@ export interface MortgageLiability { * @export * @interface MortgagePropertyAddress */ -// Edited by Plaid, line 9. any to unknown export interface MortgagePropertyAddress { - [key: string]: object | unknown; - /** * The city name. * @type {string} @@ -24456,10 +23050,7 @@ export interface MortgagePropertyAddress { * @export * @interface MultiDocumentRiskSignal */ -// Edited by Plaid, line 9. any to unknown export interface MultiDocumentRiskSignal { - [key: string]: object | unknown; - /** * Array of objects containing attributes that could indicate if a document is fraudulent * @type {Array} @@ -24478,10 +23069,7 @@ export interface MultiDocumentRiskSignal { * @export * @interface NameMatchScore */ -// Edited by Plaid, line 9. any to unknown export interface NameMatchScore { - [key: string]: object | unknown; - /** * Match score for name. 100 is a perfect score, 99-85 means a strong match, 84-70 is a partial match, any score less than 70 is a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the name is missing from either the API or financial institution, this is null. * @type {number} @@ -24513,10 +23101,7 @@ export interface NameMatchScore { * @export * @interface NetPay */ -// Edited by Plaid, line 9. any to unknown export interface NetPay { - [key: string]: object | unknown; - /** * Raw amount of the net pay for the pay period * @type {number} @@ -24560,7 +23145,6 @@ export interface NetPay { * @export * @interface NewAccountsAvailableWebhook */ -// Edited by Plaid, line 9. any to unknown export interface NewAccountsAvailableWebhook { /** * `ITEM` @@ -24598,10 +23182,7 @@ export interface NewAccountsAvailableWebhook { * @export * @interface Numbers */ -// Edited by Plaid, line 9. any to unknown export interface Numbers { - [key: string]: object | unknown; - /** * Will be used for the account number. * @type {string} @@ -24656,10 +23237,7 @@ export interface Numbers { * @export * @interface NumbersACATS */ -// Edited by Plaid, line 9. any to unknown export interface NumbersACATS { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24684,10 +23262,7 @@ export interface NumbersACATS { * @export * @interface NumbersACH */ -// Edited by Plaid, line 9. any to unknown export interface NumbersACH { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24730,7 +23305,6 @@ export interface NumbersACH { * @export * @interface NumbersACHNullable */ -// Edited by Plaid, line 9. any to unknown export interface NumbersACHNullable { /** * The Plaid account ID associated with the account numbers @@ -24774,10 +23348,7 @@ export interface NumbersACHNullable { * @export * @interface NumbersATON */ -// Edited by Plaid, line 9. any to unknown export interface NumbersATON { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24796,10 +23367,7 @@ export interface NumbersATON { * @export * @interface NumbersBACS */ -// Edited by Plaid, line 9. any to unknown export interface NumbersBACS { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24824,7 +23392,6 @@ export interface NumbersBACS { * @export * @interface NumbersBACSNullable */ -// Edited by Plaid, line 9. any to unknown export interface NumbersBACSNullable { /** * The Plaid account ID associated with the account numbers @@ -24850,10 +23417,7 @@ export interface NumbersBACSNullable { * @export * @interface NumbersEFT */ -// Edited by Plaid, line 9. any to unknown export interface NumbersEFT { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24884,7 +23448,6 @@ export interface NumbersEFT { * @export * @interface NumbersEFTNullable */ -// Edited by Plaid, line 9. any to unknown export interface NumbersEFTNullable { /** * The Plaid account ID associated with the account numbers @@ -24916,7 +23479,6 @@ export interface NumbersEFTNullable { * @export * @interface NumbersIBANNullable */ -// Edited by Plaid, line 9. any to unknown export interface NumbersIBANNullable { } /** @@ -24924,10 +23486,7 @@ export interface NumbersIBANNullable { * @export * @interface NumbersInternational */ -// Edited by Plaid, line 9. any to unknown export interface NumbersInternational { - [key: string]: object | unknown; - /** * The Plaid account ID associated with the account numbers * @type {string} @@ -24952,10 +23511,7 @@ export interface NumbersInternational { * @export * @interface NumbersInternationalIBAN */ -// Edited by Plaid, line 9. any to unknown export interface NumbersInternationalIBAN { - [key: string]: object | unknown; - /** * International Bank Account Number (IBAN). * @type {string} @@ -24974,7 +23530,6 @@ export interface NumbersInternationalIBAN { * @export * @interface NumbersInternationalNullable */ -// Edited by Plaid, line 9. any to unknown export interface NumbersInternationalNullable { /** * The Plaid account ID associated with the account numbers @@ -25010,10 +23565,7 @@ export enum OmittableTransferType { * @export * @interface OptionContract */ -// Edited by Plaid, line 9. any to unknown export interface OptionContract { - [key: string]: object | unknown; - /** * The type of this option contract. It is one of: `put`: for Put option contracts `call`: for Call option contracts * @type {string} @@ -25044,10 +23596,7 @@ export interface OptionContract { * @export * @interface Originator */ -// Edited by Plaid, line 9. any to unknown export interface Originator { - [key: string]: object | unknown; - /** * Originator’s client ID. * @type {string} @@ -25088,10 +23637,7 @@ export enum OtherAccountSubtype { * @export * @interface OtherFilter */ -// Edited by Plaid, line 9. any to unknown export interface OtherFilter { - [key: string]: object | unknown; - /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -25118,10 +23664,7 @@ export enum OverrideAccountType { * @export * @interface OverrideAccounts */ -// Edited by Plaid, line 9. any to unknown export interface OverrideAccounts { - [key: string]: object | unknown; - /** * * @type {OverrideAccountType} @@ -25212,10 +23755,7 @@ export interface OverrideAccounts { * @export * @interface Owner */ -// Edited by Plaid, line 9. any to unknown export interface Owner { - [key: string]: object | unknown; - /** * A list of names associated with the account by the financial institution. In the case of a joint account, Plaid will make a best effort to report the names of all account holders. If an Item contains multiple accounts with different owner names, some institutions will report all names associated with the Item in each account\'s `names` array. * @type {Array} @@ -25252,10 +23792,7 @@ export interface Owner { * @export * @interface OwnerOverride */ -// Edited by Plaid, line 9. any to unknown export interface OwnerOverride { - [key: string]: object | unknown; - /** * A list of names associated with the account by the financial institution. These should always be the names of individuals, even for business accounts. Note that the same name data will be used for all accounts associated with an Item. * @type {Array} @@ -25310,10 +23847,7 @@ export enum POBoxStatus { * @export * @interface PSLFStatus */ -// Edited by Plaid, line 9. any to unknown export interface PSLFStatus { - [key: string]: object | unknown; - /** * The estimated date borrower will have completed 120 qualifying monthly payments. Returned in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD). * @type {string} @@ -25338,10 +23872,7 @@ export interface PSLFStatus { * @export * @interface Parties */ -// Edited by Plaid, line 9. any to unknown export interface Parties { - [key: string]: object | unknown; - /** * * @type {Array} @@ -25354,7 +23885,6 @@ export interface Parties { * @export * @interface PartnerCustomerCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -25470,10 +24000,7 @@ export interface PartnerCustomerCreateRequest { * @export * @interface PartnerCustomerCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerCreateResponse { - [key: string]: object | unknown; - /** * * @type {PartnerEndCustomerWithSecrets} @@ -25492,7 +24019,6 @@ export interface PartnerCustomerCreateResponse { * @export * @interface PartnerCustomerEnableRequest */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerEnableRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -25518,10 +24044,7 @@ export interface PartnerCustomerEnableRequest { * @export * @interface PartnerCustomerEnableResponse */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerEnableResponse { - [key: string]: object | unknown; - /** * The end customer\'s secret key for the Production environment. * @type {string} @@ -25540,7 +24063,6 @@ export interface PartnerCustomerEnableResponse { * @export * @interface PartnerCustomerGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -25566,10 +24088,7 @@ export interface PartnerCustomerGetRequest { * @export * @interface PartnerCustomerGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerGetResponse { - [key: string]: object | unknown; - /** * * @type {PartnerEndCustomer} @@ -25588,7 +24107,6 @@ export interface PartnerCustomerGetResponse { * @export * @interface PartnerCustomerOAuthInstitutionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerOAuthInstitutionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -25614,10 +24132,7 @@ export interface PartnerCustomerOAuthInstitutionsGetRequest { * @export * @interface PartnerCustomerOAuthInstitutionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerOAuthInstitutionsGetResponse { - [key: string]: object | unknown; - /** * * @type {PartnerEndCustomerFlowdownStatus} @@ -25648,7 +24163,6 @@ export interface PartnerCustomerOAuthInstitutionsGetResponse { * @export * @interface PartnerCustomerRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -25674,10 +24188,7 @@ export interface PartnerCustomerRemoveRequest { * @export * @interface PartnerCustomerRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface PartnerCustomerRemoveResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -25690,10 +24201,7 @@ export interface PartnerCustomerRemoveResponse { * @export * @interface PartnerEndCustomer */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomer { - [key: string]: object | unknown; - /** * The `client_id` of the end customer. * @type {string} @@ -25718,10 +24226,7 @@ export interface PartnerEndCustomer { * @export * @interface PartnerEndCustomerAddress */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerAddress { - [key: string]: object | unknown; - /** * * @type {string} @@ -25758,10 +24263,7 @@ export interface PartnerEndCustomerAddress { * @export * @interface PartnerEndCustomerAssetsUnderManagement */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerAssetsUnderManagement { - [key: string]: object | unknown; - /** * * @type {number} @@ -25780,10 +24282,7 @@ export interface PartnerEndCustomerAssetsUnderManagement { * @export * @interface PartnerEndCustomerBillingContact */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerBillingContact { - [key: string]: object | unknown; - /** * * @type {string} @@ -25808,10 +24307,7 @@ export interface PartnerEndCustomerBillingContact { * @export * @interface PartnerEndCustomerCustomerSupportInfo */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerCustomerSupportInfo { - [key: string]: object | unknown; - /** * * @type {string} @@ -25854,10 +24350,7 @@ export enum PartnerEndCustomerFlowdownStatus { * @export * @interface PartnerEndCustomerOAuthInstitution */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerOAuthInstitution { - [key: string]: object | unknown; - /** * * @type {string} @@ -25907,10 +24400,7 @@ export enum PartnerEndCustomerOAuthInstitutionApplicationStatus { * @export * @interface PartnerEndCustomerOAuthInstitutionEnvironments */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerOAuthInstitutionEnvironments { - [key: string]: object | unknown; - /** * * @type {PartnerEndCustomerOAuthInstitutionApplicationStatus} @@ -25942,7 +24432,6 @@ export enum PartnerEndCustomerOAuthStatusUpdatedValues { * @export * @interface PartnerEndCustomerOAuthStatusUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerOAuthStatusUpdatedWebhook { /** * `PARTNER` @@ -26003,10 +24492,7 @@ export enum PartnerEndCustomerQuestionnaireStatus { * @export * @interface PartnerEndCustomerSecrets */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerSecrets { - [key: string]: object | unknown; - /** * The end customer\'s secret key for the Sandbox environment. * @type {string} @@ -26037,10 +24523,7 @@ export enum PartnerEndCustomerStatus { * @export * @interface PartnerEndCustomerTechnicalContact */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerTechnicalContact { - [key: string]: object | unknown; - /** * * @type {string} @@ -26065,7 +24548,6 @@ export interface PartnerEndCustomerTechnicalContact { * @export * @interface PartnerEndCustomerWithSecrets */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerWithSecrets { /** * The `client_id` of the end customer. @@ -26097,7 +24579,6 @@ export interface PartnerEndCustomerWithSecrets { * @export * @interface PartnerEndCustomerWithSecretsAllOf */ -// Edited by Plaid, line 9. any to unknown export interface PartnerEndCustomerWithSecretsAllOf { /** * @@ -26111,10 +24592,7 @@ export interface PartnerEndCustomerWithSecretsAllOf { * @export * @interface Party */ -// Edited by Plaid, line 9. any to unknown export interface Party { - [key: string]: object | unknown; - /** * * @type {PartyIndividual} @@ -26139,10 +24617,7 @@ export interface Party { * @export * @interface PartyIndividual */ -// Edited by Plaid, line 9. any to unknown export interface PartyIndividual { - [key: string]: object | unknown; - /** * * @type {IndividualName} @@ -26164,10 +24639,7 @@ export enum PartyRoleType { * @export * @interface Pay */ -// Edited by Plaid, line 9. any to unknown export interface Pay { - [key: string]: object | unknown; - /** * A numerical amount of a specific currency. * @type {number} @@ -26186,10 +24658,7 @@ export interface Pay { * @export * @interface PayFrequency */ -// Edited by Plaid, line 9. any to unknown export interface PayFrequency { - [key: string]: object | unknown; - /** * * @type {PayFrequencyValue} @@ -26222,10 +24691,7 @@ export enum PayFrequencyValue { * @export * @interface PayPeriodDetails */ -// Edited by Plaid, line 9. any to unknown export interface PayPeriodDetails { - [key: string]: object | unknown; - /** * The amount of the paycheck. * @type {number} @@ -26295,10 +24761,7 @@ export enum PayPeriodDetailsPayFrequency { * @export * @interface PayStubDeductionsBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface PayStubDeductionsBreakdown { - [key: string]: object | unknown; - /** * Raw amount of the deduction * @type {number} @@ -26335,10 +24798,7 @@ export interface PayStubDeductionsBreakdown { * @export * @interface PayStubDeductionsTotal */ -// Edited by Plaid, line 9. any to unknown export interface PayStubDeductionsTotal { - [key: string]: object | unknown; - /** * Raw amount of the deduction * @type {number} @@ -26369,10 +24829,7 @@ export interface PayStubDeductionsTotal { * @export * @interface PayStubDistributionBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface PayStubDistributionBreakdown { - [key: string]: object | unknown; - /** * Name of the account for the given distribution. * @type {string} @@ -26421,10 +24878,7 @@ export interface PayStubDistributionBreakdown { * @export * @interface PayStubEarningsBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface PayStubEarningsBreakdown { - [key: string]: object | unknown; - /** * Commonly used term to describe the earning line item. * @type {string} @@ -26479,10 +24933,7 @@ export interface PayStubEarningsBreakdown { * @export * @interface PayStubEarningsTotal */ -// Edited by Plaid, line 9. any to unknown export interface PayStubEarningsTotal { - [key: string]: object | unknown; - /** * Total amount of the earnings for this pay period. * @type {number} @@ -26519,10 +24970,7 @@ export interface PayStubEarningsTotal { * @export * @interface PayStubPayPeriodDetails */ -// Edited by Plaid, line 9. any to unknown export interface PayStubPayPeriodDetails { - [key: string]: object | unknown; - /** * The amount of the paycheck. * @type {number} @@ -26589,10 +25037,7 @@ export interface PayStubPayPeriodDetails { * @export * @interface PayStubTaxpayerID */ -// Edited by Plaid, line 9. any to unknown export interface PayStubTaxpayerID { - [key: string]: object | unknown; - /** * Type of ID, e.g. \'SSN\'. * @type {string} @@ -26611,7 +25056,6 @@ export interface PayStubTaxpayerID { * @export * @interface PaymentAmount */ -// Edited by Plaid, line 9. any to unknown export interface PaymentAmount { /** * @@ -26645,10 +25089,7 @@ export enum PaymentAmountCurrency { * @export * @interface PaymentAmountNullable */ -// Edited by Plaid, line 9. any to unknown export interface PaymentAmountNullable { - [key: string]: object | unknown; - /** * * @type {PaymentAmountCurrency} @@ -26667,7 +25108,6 @@ export interface PaymentAmountNullable { * @export * @interface PaymentAmountRefunded */ -// Edited by Plaid, line 9. any to unknown export interface PaymentAmountRefunded { /** * @@ -26687,7 +25127,6 @@ export interface PaymentAmountRefunded { * @export * @interface PaymentAmountToRefund */ -// Edited by Plaid, line 9. any to unknown export interface PaymentAmountToRefund { /** * @@ -26718,7 +25157,6 @@ export enum PaymentChannel { * @export * @interface PaymentConsentMaxPaymentAmount */ -// Edited by Plaid, line 9. any to unknown export interface PaymentConsentMaxPaymentAmount { /** * @@ -26748,7 +25186,6 @@ export enum PaymentConsentPeriodicAlignment { * @export * @interface PaymentConsentPeriodicAmount */ -// Edited by Plaid, line 9. any to unknown export interface PaymentConsentPeriodicAmount { /** * @@ -26774,7 +25211,6 @@ export interface PaymentConsentPeriodicAmount { * @export * @interface PaymentConsentPeriodicAmountAmount */ -// Edited by Plaid, line 9. any to unknown export interface PaymentConsentPeriodicAmountAmount { /** * @@ -26806,7 +25242,6 @@ export enum PaymentConsentPeriodicInterval { * @export * @interface PaymentConsentValidDateTime */ -// Edited by Plaid, line 9. any to unknown export interface PaymentConsentValidDateTime { /** * The date and time from which the consent should be active, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format. @@ -26826,10 +25261,7 @@ export interface PaymentConsentValidDateTime { * @export * @interface PaymentInitiationAddress */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationAddress { - [key: string]: object | unknown; - /** * An array of length 1-2 representing the street address where the recipient is located. Maximum of 70 characters. * @type {Array} @@ -26860,10 +25292,7 @@ export interface PaymentInitiationAddress { * @export * @interface PaymentInitiationConsent */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsent { - [key: string]: object | unknown; - /** * The consent ID. * @type {string} @@ -26912,7 +25341,6 @@ export interface PaymentInitiationConsent { * @export * @interface PaymentInitiationConsentConstraints */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentConstraints { /** * @@ -26938,7 +25366,6 @@ export interface PaymentInitiationConsentConstraints { * @export * @interface PaymentInitiationConsentCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -26988,10 +25415,7 @@ export interface PaymentInitiationConsentCreateRequest { * @export * @interface PaymentInitiationConsentCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentCreateResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the payment consent. * @type {string} @@ -27016,7 +25440,6 @@ export interface PaymentInitiationConsentCreateResponse { * @export * @interface PaymentInitiationConsentGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27042,7 +25465,6 @@ export interface PaymentInitiationConsentGetRequest { * @export * @interface PaymentInitiationConsentGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentGetResponse { /** * The consent ID. @@ -27098,7 +25520,6 @@ export interface PaymentInitiationConsentGetResponse { * @export * @interface PaymentInitiationConsentPaymentExecuteRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentPaymentExecuteRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27136,10 +25557,7 @@ export interface PaymentInitiationConsentPaymentExecuteRequest { * @export * @interface PaymentInitiationConsentPaymentExecuteResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentPaymentExecuteResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the payment * @type {string} @@ -27164,7 +25582,6 @@ export interface PaymentInitiationConsentPaymentExecuteResponse { * @export * @interface PaymentInitiationConsentRevokeRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentRevokeRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27190,10 +25607,7 @@ export interface PaymentInitiationConsentRevokeRequest { * @export * @interface PaymentInitiationConsentRevokeResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationConsentRevokeResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -27229,10 +25643,7 @@ export enum PaymentInitiationConsentStatus { * @export * @interface PaymentInitiationMetadata */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationMetadata { - [key: string]: object | unknown; - /** * Indicates whether the institution supports payments from a different country. * @type {boolean} @@ -27269,7 +25680,6 @@ export interface PaymentInitiationMetadata { * @export * @interface PaymentInitiationOptionalRestrictionBacs */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationOptionalRestrictionBacs { /** * The account number of the account. Maximum of 10 characters. @@ -27289,10 +25699,7 @@ export interface PaymentInitiationOptionalRestrictionBacs { * @export * @interface PaymentInitiationPayment */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPayment { - [key: string]: object | unknown; - /** * The ID of the payment. Like all Plaid identifiers, the `payment_id` is case sensitive. * @type {string} @@ -27407,7 +25814,6 @@ export interface PaymentInitiationPayment { * @export * @interface PaymentInitiationPaymentCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27457,10 +25863,7 @@ export interface PaymentInitiationPaymentCreateRequest { * @export * @interface PaymentInitiationPaymentCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentCreateResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the payment * @type {string} @@ -27494,7 +25897,6 @@ export enum PaymentInitiationPaymentCreateStatus { * @export * @interface PaymentInitiationPaymentGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27520,7 +25922,6 @@ export interface PaymentInitiationPaymentGetRequest { * @export * @interface PaymentInitiationPaymentGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentGetResponse { /** * The ID of the payment. Like all Plaid identifiers, the `payment_id` is case sensitive. @@ -27642,7 +26043,6 @@ export interface PaymentInitiationPaymentGetResponse { * @export * @interface PaymentInitiationPaymentListRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27680,10 +26080,7 @@ export interface PaymentInitiationPaymentListRequest { * @export * @interface PaymentInitiationPaymentListResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentListResponse { - [key: string]: object | unknown; - /** * An array of payments that have been created, associated with the given `client_id`. * @type {Array} @@ -27708,7 +26105,6 @@ export interface PaymentInitiationPaymentListResponse { * @export * @interface PaymentInitiationPaymentReverseRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentReverseRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27752,10 +26148,7 @@ export interface PaymentInitiationPaymentReverseRequest { * @export * @interface PaymentInitiationPaymentReverseResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentReverseResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the refund * @type {string} @@ -27802,7 +26195,6 @@ export enum PaymentInitiationPaymentStatus { * @export * @interface PaymentInitiationPaymentTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27828,10 +26220,7 @@ export interface PaymentInitiationPaymentTokenCreateRequest { * @export * @interface PaymentInitiationPaymentTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationPaymentTokenCreateResponse { - [key: string]: object | unknown; - /** * A `payment_token` that can be provided to Link initialization to enter the payment initiation flow * @type {string} @@ -27856,10 +26245,7 @@ export interface PaymentInitiationPaymentTokenCreateResponse { * @export * @interface PaymentInitiationRecipient */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipient { - [key: string]: object | unknown; - /** * The ID of the recipient. * @type {string} @@ -27896,7 +26282,6 @@ export interface PaymentInitiationRecipient { * @export * @interface PaymentInitiationRecipientCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27940,10 +26325,7 @@ export interface PaymentInitiationRecipientCreateRequest { * @export * @interface PaymentInitiationRecipientCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientCreateResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the recipient * @type {string} @@ -27962,7 +26344,6 @@ export interface PaymentInitiationRecipientCreateResponse { * @export * @interface PaymentInitiationRecipientGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -27988,7 +26369,6 @@ export interface PaymentInitiationRecipientGetRequest { * @export * @interface PaymentInitiationRecipientGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientGetResponse { /** * The ID of the recipient. @@ -28032,7 +26412,6 @@ export interface PaymentInitiationRecipientGetResponse { * @export * @interface PaymentInitiationRecipientGetResponseAllOf */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientGetResponseAllOf { /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. @@ -28046,7 +26425,6 @@ export interface PaymentInitiationRecipientGetResponseAllOf { * @export * @interface PaymentInitiationRecipientListRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -28066,10 +26444,7 @@ export interface PaymentInitiationRecipientListRequest { * @export * @interface PaymentInitiationRecipientListResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationRecipientListResponse { - [key: string]: object | unknown; - /** * An array of payment recipients created for Payment Initiation * @type {Array} @@ -28088,10 +26463,7 @@ export interface PaymentInitiationRecipientListResponse { * @export * @interface PaymentInitiationStandingOrderMetadata */ -// Edited by Plaid, line 9. any to unknown export interface PaymentInitiationStandingOrderMetadata { - [key: string]: object | unknown; - /** * Indicates whether the institution supports closed-ended standing orders by providing an end date. * @type {boolean} @@ -28116,10 +26488,7 @@ export interface PaymentInitiationStandingOrderMetadata { * @export * @interface PaymentMeta */ -// Edited by Plaid, line 9. any to unknown export interface PaymentMeta { - [key: string]: object | unknown; - /** * The transaction reference number supplied by the financial institution. * @type {string} @@ -28174,7 +26543,6 @@ export interface PaymentMeta { * @export * @interface PaymentProfileCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -28194,10 +26562,7 @@ export interface PaymentProfileCreateRequest { * @export * @interface PaymentProfileCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileCreateResponse { - [key: string]: object | unknown; - /** * A payment profile token associated with the Payment Profile data that is being requested. * @type {string} @@ -28216,7 +26581,6 @@ export interface PaymentProfileCreateResponse { * @export * @interface PaymentProfileGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -28242,10 +26606,7 @@ export interface PaymentProfileGetRequest { * @export * @interface PaymentProfileGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileGetResponse { - [key: string]: object | unknown; - /** * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time the given Payment Profile was updated at * @type {string} @@ -28282,7 +26643,6 @@ export interface PaymentProfileGetResponse { * @export * @interface PaymentProfileRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -28308,10 +26668,7 @@ export interface PaymentProfileRemoveRequest { * @export * @interface PaymentProfileRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface PaymentProfileRemoveResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -28358,10 +26715,7 @@ export enum PaymentScheme { * @export * @interface PaymentStatusUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface PaymentStatusUpdateWebhook { - [key: string]: object | unknown; - /** * `PAYMENT_INITIATION` * @type {string} @@ -28446,10 +26800,7 @@ export interface PaymentStatusUpdateWebhook { * @export * @interface PayrollIncomeAccountData */ -// Edited by Plaid, line 9. any to unknown export interface PayrollIncomeAccountData { - [key: string]: object | unknown; - /** * ID of the payroll provider account. * @type {string} @@ -28474,10 +26825,7 @@ export interface PayrollIncomeAccountData { * @export * @interface PayrollIncomeObject */ -// Edited by Plaid, line 9. any to unknown export interface PayrollIncomeObject { - [key: string]: object | unknown; - /** * ID of the payroll provider account. * @type {string} @@ -28508,10 +26856,7 @@ export interface PayrollIncomeObject { * @export * @interface PayrollIncomeRateOfPay */ -// Edited by Plaid, line 9. any to unknown export interface PayrollIncomeRateOfPay { - [key: string]: object | unknown; - /** * The rate at which an employee is paid. * @type {string} @@ -28530,7 +26875,6 @@ export interface PayrollIncomeRateOfPay { * @export * @interface PayrollItem */ -// Edited by Plaid, line 9. any to unknown export interface PayrollItem { /** * The `item_id` of the Item associated with this webhook, warning, or error @@ -28580,10 +26924,7 @@ export interface PayrollItem { * @export * @interface PayrollItemStatus */ -// Edited by Plaid, line 9. any to unknown export interface PayrollItemStatus { - [key: string]: object | unknown; - /** * Denotes the processing status for the verification. `UNKNOWN`: The processing status could not be determined. `PROCESSING_COMPLETE`: The processing has completed and the user has approved for sharing. The data is available to be retrieved. `PROCESSING`: The verification is still processing. The data is not available yet. `FAILED`: The processing failed to complete successfully. `APPROVAL_STATUS_PENDING`: The processing has completed but the user has not yet approved the sharing of the data. * @type {string} @@ -28596,10 +26937,7 @@ export interface PayrollItemStatus { * @export * @interface PayrollRiskSignalsItem */ -// Edited by Plaid, line 9. any to unknown export interface PayrollRiskSignalsItem { - [key: string]: object | unknown; - /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -28618,10 +26956,7 @@ export interface PayrollRiskSignalsItem { * @export * @interface Paystub */ -// Edited by Plaid, line 9. any to unknown export interface Paystub { - [key: string]: object | unknown; - /** * * @type {Deductions} @@ -28698,10 +27033,7 @@ export interface Paystub { * @export * @interface PaystubAddress */ -// Edited by Plaid, line 9. any to unknown export interface PaystubAddress { - [key: string]: object | unknown; - /** * The full city name. * @type {string} @@ -28759,10 +27091,7 @@ export interface PaystubAddress { * @export * @interface PaystubDeduction */ -// Edited by Plaid, line 9. any to unknown export interface PaystubDeduction { - [key: string]: object | unknown; - /** * The description of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. * @type {string} @@ -28787,10 +27116,7 @@ export interface PaystubDeduction { * @export * @interface PaystubDetails */ -// Edited by Plaid, line 9. any to unknown export interface PaystubDetails { - [key: string]: object | unknown; - /** * Beginning date of the pay period on the paystub in the \'YYYY-MM-DD\' format. * @type {string} @@ -28827,10 +27153,7 @@ export interface PaystubDetails { * @export * @interface PaystubEmployer */ -// Edited by Plaid, line 9. any to unknown export interface PaystubEmployer { - [key: string]: object | unknown; - /** * * @type {PaystubAddress} @@ -28849,7 +27172,6 @@ export interface PaystubEmployer { * @export * @interface PaystubOverride */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverride { /** * @@ -28881,10 +27203,7 @@ export interface PaystubOverride { * @export * @interface PaystubOverrideDistributionBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverrideDistributionBreakdown { - [key: string]: object | unknown; - /** * Name of the account for the given distribution. * @type {string} @@ -28927,7 +27246,6 @@ export interface PaystubOverrideDistributionBreakdown { * @export * @interface PaystubOverrideEmployee */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverrideEmployee { /** * The name of the employee. @@ -28947,7 +27265,6 @@ export interface PaystubOverrideEmployee { * @export * @interface PaystubOverrideEmployeeAddress */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverrideEmployeeAddress { /** * The full city name. @@ -28985,7 +27302,6 @@ export interface PaystubOverrideEmployeeAddress { * @export * @interface PaystubOverrideEmployer */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverrideEmployer { /** * The name of the employer. @@ -28999,10 +27315,7 @@ export interface PaystubOverrideEmployer { * @export * @interface PaystubOverridePayPeriodDetails */ -// Edited by Plaid, line 9. any to unknown export interface PaystubOverridePayPeriodDetails { - [key: string]: object | unknown; - /** * The amount of the paycheck. * @type {number} @@ -29071,10 +27384,7 @@ export enum PaystubPayFrequency { * @export * @interface PaystubYTDDetails */ -// Edited by Plaid, line 9. any to unknown export interface PaystubYTDDetails { - [key: string]: object | unknown; - /** * Year-to-date gross earnings. * @type {number} @@ -29093,10 +27403,7 @@ export interface PaystubYTDDetails { * @export * @interface PendingExpirationWebhook */ -// Edited by Plaid, line 9. any to unknown export interface PendingExpirationWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -29133,10 +27440,7 @@ export interface PendingExpirationWebhook { * @export * @interface PersonalFinanceCategory */ -// Edited by Plaid, line 9. any to unknown export interface PersonalFinanceCategory { - [key: string]: object | unknown; - /** * A high level category that communicates the broad category of the transaction. * @type {string} @@ -29161,10 +27465,7 @@ export interface PersonalFinanceCategory { * @export * @interface PhoneNumber */ -// Edited by Plaid, line 9. any to unknown export interface PhoneNumber { - [key: string]: object | unknown; - /** * The phone number. * @type {string} @@ -29203,10 +27504,7 @@ export enum PhoneNumberTypeEnum { * @export * @interface PhoneNumberMatchScore */ -// Edited by Plaid, line 9. any to unknown export interface PhoneNumberMatchScore { - [key: string]: object | unknown; - /** * Match score for normalized phone number. 100 is a perfect match, 99-70 is a partial match (matching the same phone number with extension against one without extension, etc.), anything below 70 is considered a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the phone number is missing from either the API or financial institution, this is null. * @type {number} @@ -29243,10 +27541,7 @@ export enum PhysicalDocumentCategory { * @export * @interface PhysicalDocumentExtractedData */ -// Edited by Plaid, line 9. any to unknown export interface PhysicalDocumentExtractedData { - [key: string]: object | unknown; - /** * Alpha-numeric ID number extracted via OCR from the user\'s document image. * @type {string} @@ -29295,10 +27590,7 @@ export interface PhysicalDocumentExtractedData { * @export * @interface PhysicalDocumentExtractedDataAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface PhysicalDocumentExtractedDataAnalysis { - [key: string]: object | unknown; - /** * * @type {DocumentNameMatchCode} @@ -29329,10 +27621,7 @@ export interface PhysicalDocumentExtractedDataAnalysis { * @export * @interface PhysicalDocumentImages */ -// Edited by Plaid, line 9. any to unknown export interface PhysicalDocumentImages { - [key: string]: object | unknown; - /** * Temporary URL that expires after 60 seconds for downloading the uncropped original image of the front of the document. * @type {string} @@ -29369,10 +27658,7 @@ export interface PhysicalDocumentImages { * @export * @interface PlaidError */ -// Edited by Plaid, line 9. any to unknown export interface PlaidError { - [key: string]: object | unknown; - /** * * @type {PlaidErrorType} @@ -29455,10 +27741,7 @@ export enum PlaidErrorType { * @export * @interface PlatformIds */ -// Edited by Plaid, line 9. any to unknown export interface PlatformIds { - [key: string]: object | unknown; - /** * The ID of an employee as given by their employer * @type {string} @@ -29483,7 +27766,6 @@ export interface PlatformIds { * @export * @interface ProcessorAccountGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorAccountGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29509,10 +27791,7 @@ export interface ProcessorAccountGetRequest { * @export * @interface ProcessorAccountGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorAccountGetResponse { - [key: string]: object | unknown; - /** * * @type {AccountBase} @@ -29531,7 +27810,6 @@ export interface ProcessorAccountGetResponse { * @export * @interface ProcessorApexProcessorTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorApexProcessorTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29563,7 +27841,6 @@ export interface ProcessorApexProcessorTokenCreateRequest { * @export * @interface ProcessorAuthGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorAuthGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29589,10 +27866,7 @@ export interface ProcessorAuthGetRequest { * @export * @interface ProcessorAuthGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorAuthGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29617,7 +27891,6 @@ export interface ProcessorAuthGetResponse { * @export * @interface ProcessorBalanceGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorBalanceGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29649,7 +27922,6 @@ export interface ProcessorBalanceGetRequest { * @export * @interface ProcessorBalanceGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorBalanceGetRequestOptions { /** * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the oldest acceptable balance when making a request to `/accounts/balance/get`. If the balance that is pulled for `ins_128026` (Capital One) is older than the given timestamp, an `INVALID_REQUEST` error with the code of `LAST_UPDATED_DATETIME_OUT_OF_RANGE` will be returned with the most recent timestamp for the requested account contained in the response. This field is only used when the institution is `ins_128026` (Capital One), in which case a value must be provided or an `INVALID_REQUEST` error with the code of `INVALID_FIELD` will be returned. For all other institutions, this field is ignored. @@ -29663,10 +27935,7 @@ export interface ProcessorBalanceGetRequestOptions { * @export * @interface ProcessorBalanceGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorBalanceGetResponse { - [key: string]: object | unknown; - /** * * @type {AccountBase} @@ -29685,7 +27954,6 @@ export interface ProcessorBalanceGetResponse { * @export * @interface ProcessorBankTransferCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorBankTransferCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29777,10 +28045,7 @@ export interface ProcessorBankTransferCreateRequest { * @export * @interface ProcessorBankTransferCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorBankTransferCreateResponse { - [key: string]: object | unknown; - /** * * @type {BankTransfer} @@ -29799,10 +28064,7 @@ export interface ProcessorBankTransferCreateResponse { * @export * @interface ProcessorDefaultUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorDefaultUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -29845,10 +28107,7 @@ export interface ProcessorDefaultUpdateWebhook { * @export * @interface ProcessorHistoricalUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorHistoricalUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -29891,7 +28150,6 @@ export interface ProcessorHistoricalUpdateWebhook { * @export * @interface ProcessorIdentityGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorIdentityGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29917,10 +28175,7 @@ export interface ProcessorIdentityGetRequest { * @export * @interface ProcessorIdentityGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorIdentityGetResponse { - [key: string]: object | unknown; - /** * * @type {AccountIdentity} @@ -29939,7 +28194,6 @@ export interface ProcessorIdentityGetResponse { * @export * @interface ProcessorIdentityMatchRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorIdentityMatchRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -29971,10 +28225,7 @@ export interface ProcessorIdentityMatchRequest { * @export * @interface ProcessorIdentityMatchResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorIdentityMatchResponse { - [key: string]: object | unknown; - /** * * @type {AccountIdentityMatchScore} @@ -29993,10 +28244,7 @@ export interface ProcessorIdentityMatchResponse { * @export * @interface ProcessorInitialUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorInitialUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -30039,7 +28287,6 @@ export interface ProcessorInitialUpdateWebhook { * @export * @interface ProcessorLiabilitiesGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorLiabilitiesGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30065,10 +28312,7 @@ export interface ProcessorLiabilitiesGetRequest { * @export * @interface ProcessorLiabilitiesGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorLiabilitiesGetResponse { - [key: string]: object | unknown; - /** * * @type {AccountBase} @@ -30093,10 +28337,7 @@ export interface ProcessorLiabilitiesGetResponse { * @export * @interface ProcessorNumber */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorNumber { - [key: string]: object | unknown; - /** * * @type {NumbersACHNullable} @@ -30127,10 +28368,7 @@ export interface ProcessorNumber { * @export * @interface ProcessorRecurringTransactionsUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorRecurringTransactionsUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -30161,7 +28399,6 @@ export interface ProcessorRecurringTransactionsUpdateWebhook { * @export * @interface ProcessorSignalDecisionReportRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalDecisionReportRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30223,10 +28460,7 @@ export interface ProcessorSignalDecisionReportRequest { * @export * @interface ProcessorSignalDecisionReportResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalDecisionReportResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30239,7 +28473,6 @@ export interface ProcessorSignalDecisionReportResponse { * @export * @interface ProcessorSignalEvaluateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalEvaluateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30313,10 +28546,7 @@ export interface ProcessorSignalEvaluateRequest { * @export * @interface ProcessorSignalEvaluateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalEvaluateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30347,7 +28577,6 @@ export interface ProcessorSignalEvaluateResponse { * @export * @interface ProcessorSignalPrepareRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalPrepareRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30373,10 +28602,7 @@ export interface ProcessorSignalPrepareRequest { * @export * @interface ProcessorSignalPrepareResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalPrepareResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30389,7 +28615,6 @@ export interface ProcessorSignalPrepareResponse { * @export * @interface ProcessorSignalReturnReportRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalReturnReportRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30433,10 +28658,7 @@ export interface ProcessorSignalReturnReportRequest { * @export * @interface ProcessorSignalReturnReportResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSignalReturnReportResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30449,7 +28671,6 @@ export interface ProcessorSignalReturnReportResponse { * @export * @interface ProcessorStripeBankAccountTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorStripeBankAccountTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30481,10 +28702,7 @@ export interface ProcessorStripeBankAccountTokenCreateRequest { * @export * @interface ProcessorStripeBankAccountTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorStripeBankAccountTokenCreateResponse { - [key: string]: object | unknown; - /** * A token that can be sent to Stripe for use in making API calls to Plaid * @type {string} @@ -30503,10 +28721,7 @@ export interface ProcessorStripeBankAccountTokenCreateResponse { * @export * @interface ProcessorSyncUpdatesAvailableWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorSyncUpdatesAvailableWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -30549,7 +28764,6 @@ export interface ProcessorSyncUpdatesAvailableWebhook { * @export * @interface ProcessorTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30640,10 +28854,7 @@ export enum ProcessorTokenCreateRequestProcessorEnum { * @export * @interface ProcessorTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenCreateResponse { - [key: string]: object | unknown; - /** * The `processor_token` that can then be used by the Plaid partner to make API requests * @type {string} @@ -30662,7 +28873,6 @@ export interface ProcessorTokenCreateResponse { * @export * @interface ProcessorTokenPermissionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenPermissionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30688,10 +28898,7 @@ export interface ProcessorTokenPermissionsGetRequest { * @export * @interface ProcessorTokenPermissionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenPermissionsGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30710,7 +28917,6 @@ export interface ProcessorTokenPermissionsGetResponse { * @export * @interface ProcessorTokenPermissionsSetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenPermissionsSetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30742,10 +28948,7 @@ export interface ProcessorTokenPermissionsSetRequest { * @export * @interface ProcessorTokenPermissionsSetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenPermissionsSetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30758,10 +28961,7 @@ export interface ProcessorTokenPermissionsSetResponse { * @export * @interface ProcessorTokenWebhookUpdate */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenWebhookUpdate { - [key: string]: object | unknown; - /** * `PROCESSOR_TOKEN` * @type {string} @@ -30804,7 +29004,6 @@ export interface ProcessorTokenWebhookUpdate { * @export * @interface ProcessorTokenWebhookUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenWebhookUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30836,10 +29035,7 @@ export interface ProcessorTokenWebhookUpdateRequest { * @export * @interface ProcessorTokenWebhookUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTokenWebhookUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -30852,7 +29048,6 @@ export interface ProcessorTokenWebhookUpdateResponse { * @export * @interface ProcessorTransactionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -30896,7 +29091,6 @@ export interface ProcessorTransactionsGetRequest { * @export * @interface ProcessorTransactionsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsGetRequestOptions { /** * The number of transactions to fetch. @@ -30943,10 +29137,7 @@ export interface ProcessorTransactionsGetRequestOptions { * @export * @interface ProcessorTransactionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsGetResponse { - [key: string]: object | unknown; - /** * * @type {AccountBase} @@ -30977,7 +29168,6 @@ export interface ProcessorTransactionsGetResponse { * @export * @interface ProcessorTransactionsRecurringGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsRecurringGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -31009,10 +29199,7 @@ export interface ProcessorTransactionsRecurringGetRequest { * @export * @interface ProcessorTransactionsRecurringGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsRecurringGetResponse { - [key: string]: object | unknown; - /** * An array of depository transaction streams. * @type {Array} @@ -31043,7 +29230,6 @@ export interface ProcessorTransactionsRecurringGetResponse { * @export * @interface ProcessorTransactionsRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -31069,10 +29255,7 @@ export interface ProcessorTransactionsRefreshRequest { * @export * @interface ProcessorTransactionsRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31085,10 +29268,7 @@ export interface ProcessorTransactionsRefreshResponse { * @export * @interface ProcessorTransactionsRemovedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsRemovedWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -31131,7 +29311,6 @@ export interface ProcessorTransactionsRemovedWebhook { * @export * @interface ProcessorTransactionsSyncRequest */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsSyncRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -31175,10 +29354,7 @@ export interface ProcessorTransactionsSyncRequest { * @export * @interface ProcessorTransactionsSyncResponse */ -// Edited by Plaid, line 9. any to unknown export interface ProcessorTransactionsSyncResponse { - [key: string]: object | unknown; - /** * Transactions that have been added to the Item since `cursor` ordered by ascending last modified time. * @type {Array} @@ -31221,10 +29397,7 @@ export interface ProcessorTransactionsSyncResponse { * @export * @interface ProductAccess */ -// Edited by Plaid, line 9. any to unknown export interface ProductAccess { - [key: string]: object | unknown; - /** * Allow access to statements. Only used by certain partners. If relevant to the partner and unset, defaults to `true`. * @type {boolean} @@ -31285,10 +29458,7 @@ export interface ProductAccess { * @export * @interface ProductPermissionsRequiredAuthWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProductPermissionsRequiredAuthWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -31319,10 +29489,7 @@ export interface ProductPermissionsRequiredAuthWebhook { * @export * @interface ProductPermissionsRequiredIdentityWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ProductPermissionsRequiredIdentityWebhook { - [key: string]: object | unknown; - /** * `IDENTITY` * @type {string} @@ -31353,10 +29520,7 @@ export interface ProductPermissionsRequiredIdentityWebhook { * @export * @interface ProductStatus */ -// Edited by Plaid, line 9. any to unknown export interface ProductStatus { - [key: string]: object | unknown; - /** * This field is deprecated in favor of the `breakdown` object, which provides more granular institution health data. `HEALTHY`: the majority of requests are successful `DEGRADED`: only some requests are successful `DOWN`: all requests are failing * @type {string} @@ -31393,10 +29557,7 @@ export enum ProductStatusStatusEnum { * @export * @interface ProductStatusBreakdown */ -// Edited by Plaid, line 9. any to unknown export interface ProductStatusBreakdown { - [key: string]: object | unknown; - /** * The percentage of login attempts that are successful, expressed as a decimal. * @type {number} @@ -31479,7 +29640,6 @@ export enum ProgramNameSensitivity { * @export * @interface ProjectedIncomeSummaryFieldNumber */ -// Edited by Plaid, line 9. any to unknown export interface ProjectedIncomeSummaryFieldNumber { /** * The value of the field. @@ -31512,10 +29672,7 @@ export enum ProxyType { * @export * @interface RecaptchaRequiredError */ -// Edited by Plaid, line 9. any to unknown export interface RecaptchaRequiredError { - [key: string]: object | unknown; - /** * RECAPTCHA_ERROR * @type {string} @@ -31564,10 +29721,7 @@ export interface RecaptchaRequiredError { * @export * @interface RecipientBACS */ -// Edited by Plaid, line 9. any to unknown export interface RecipientBACS { - [key: string]: object | unknown; - /** * The account number of the account. Maximum of 10 characters. * @type {string} @@ -31586,7 +29740,6 @@ export interface RecipientBACS { * @export * @interface RecipientBACSNullable */ -// Edited by Plaid, line 9. any to unknown export interface RecipientBACSNullable { /** * The account number of the account. Maximum of 10 characters. @@ -31606,10 +29759,7 @@ export interface RecipientBACSNullable { * @export * @interface Recurrence */ -// Edited by Plaid, line 9. any to unknown export interface Recurrence { - [key: string]: object | unknown; - /** * Whether or not the transaction is periodically recurring. * @type {boolean} @@ -31628,10 +29778,7 @@ export interface Recurrence { * @export * @interface RecurringCancelledWebhook */ -// Edited by Plaid, line 9. any to unknown export interface RecurringCancelledWebhook { - [key: string]: object | unknown; - /** * `TRANSFER` * @type {string} @@ -31679,10 +29826,7 @@ export enum RecurringFrequency { * @export * @interface RecurringInsightsStream */ -// Edited by Plaid, line 9. any to unknown export interface RecurringInsightsStream { - [key: string]: object | unknown; - /** * A unique id for the stream. * @type {string} @@ -31779,10 +29923,7 @@ export interface RecurringInsightsStream { * @export * @interface RecurringNewTransferWebhook */ -// Edited by Plaid, line 9. any to unknown export interface RecurringNewTransferWebhook { - [key: string]: object | unknown; - /** * `TRANSFER` * @type {string} @@ -31833,10 +29974,7 @@ export enum RecurringTransactionFrequency { * @export * @interface RecurringTransactions */ -// Edited by Plaid, line 9. any to unknown export interface RecurringTransactions { - [key: string]: object | unknown; - /** * An array of inflow transaction streams (e.g., income). * @type {Array} @@ -31855,10 +29993,7 @@ export interface RecurringTransactions { * @export * @interface RecurringTransactionsUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface RecurringTransactionsUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -31895,10 +30030,7 @@ export interface RecurringTransactionsUpdateWebhook { * @export * @interface RecurringTransfer */ -// Edited by Plaid, line 9. any to unknown export interface RecurringTransfer { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a recurring transfer. * @type {string} @@ -32008,7 +30140,6 @@ export interface RecurringTransfer { * @export * @interface RecurringTransferNullable */ -// Edited by Plaid, line 9. any to unknown export interface RecurringTransferNullable { /** * Plaid’s unique identifier for a recurring transfer. @@ -32119,10 +30250,7 @@ export interface RecurringTransferNullable { * @export * @interface RecurringTransferSkippedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface RecurringTransferSkippedWebhook { - [key: string]: object | unknown; - /** * `TRANSFER` * @type {string} @@ -32171,7 +30299,6 @@ export interface RecurringTransferSkippedWebhook { * @export * @interface RemovedTransaction */ -// Edited by Plaid, line 9. any to unknown export interface RemovedTransaction { /** * The ID of the removed transaction. @@ -32194,10 +30321,7 @@ export enum ReportType { * @export * @interface ReportingInformation */ -// Edited by Plaid, line 9. any to unknown export interface ReportingInformation { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -32210,10 +30334,7 @@ export interface ReportingInformation { * @export * @interface RiskCheckBehavior */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckBehavior { - [key: string]: object | unknown; - /** * * @type {RiskCheckBehaviorUserInteractionsLabel} @@ -32272,10 +30393,7 @@ export enum RiskCheckBehaviorUserInteractionsLabel { * @export * @interface RiskCheckDetails */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckDetails { - [key: string]: object | unknown; - /** * * @type {IdentityVerificationStepStatus} @@ -32318,10 +30436,7 @@ export interface RiskCheckDetails { * @export * @interface RiskCheckDevice */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckDevice { - [key: string]: object | unknown; - /** * * @type {ProxyType} @@ -32346,10 +30461,7 @@ export interface RiskCheckDevice { * @export * @interface RiskCheckEmail */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckEmail { - [key: string]: object | unknown; - /** * * @type {RiskCheckEmailIsDeliverableStatus} @@ -32471,10 +30583,7 @@ export enum RiskCheckEmailTopLevelDomainIsSuspicious { * @export * @interface RiskCheckIdentityAbuseSignals */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckIdentityAbuseSignals { - [key: string]: object | unknown; - /** * * @type {RiskCheckSyntheticIdentity} @@ -32535,10 +30644,7 @@ export enum RiskCheckLinkedService { * @export * @interface RiskCheckPhone */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckPhone { - [key: string]: object | unknown; - /** * A list of online services where this phone number has been detected to have accounts or other activity. * @type {Set} @@ -32551,10 +30657,7 @@ export interface RiskCheckPhone { * @export * @interface RiskCheckStolenIdentity */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckStolenIdentity { - [key: string]: object | unknown; - /** * A score from 0 to 100 indicating the likelihood that the user is a stolen identity. * @type {number} @@ -32567,10 +30670,7 @@ export interface RiskCheckStolenIdentity { * @export * @interface RiskCheckSyntheticIdentity */ -// Edited by Plaid, line 9. any to unknown export interface RiskCheckSyntheticIdentity { - [key: string]: object | unknown; - /** * A score from 0 to 100 indicating the likelihood that the user is a synthetic identity. * @type {number} @@ -32583,7 +30683,6 @@ export interface RiskCheckSyntheticIdentity { * @export * @interface RiskProfile */ -// Edited by Plaid, line 9. any to unknown export interface RiskProfile { /** * The name of the risk profile used for this transaction. @@ -32603,10 +30702,7 @@ export interface RiskProfile { * @export * @interface RiskSignalDocumentReference */ -// Edited by Plaid, line 9. any to unknown export interface RiskSignalDocumentReference { - [key: string]: object | unknown; - /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -32644,10 +30740,7 @@ export enum RiskSignalDocumentStatus { * @export * @interface Role */ -// Edited by Plaid, line 9. any to unknown export interface Role { - [key: string]: object | unknown; - /** * * @type {RoleDetail} @@ -32660,10 +30753,7 @@ export interface Role { * @export * @interface RoleDetail */ -// Edited by Plaid, line 9. any to unknown export interface RoleDetail { - [key: string]: object | unknown; - /** * * @type {PartyRoleType} @@ -32676,10 +30766,7 @@ export interface RoleDetail { * @export * @interface Roles */ -// Edited by Plaid, line 9. any to unknown export interface Roles { - [key: string]: object | unknown; - /** * * @type {Role} @@ -32692,7 +30779,6 @@ export interface Roles { * @export * @interface SandboxBankIncomeFireWebhookRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankIncomeFireWebhookRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -32730,10 +30816,7 @@ export interface SandboxBankIncomeFireWebhookRequest { * @export * @interface SandboxBankIncomeFireWebhookResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankIncomeFireWebhookResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32756,7 +30839,6 @@ export enum SandboxBankIncomeWebhookFireRequestWebhookCode { * @export * @interface SandboxBankIncomeWebhookFireRequestWebhookFields */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankIncomeWebhookFireRequestWebhookFields { /** * The user id to be returned in INCOME webhooks @@ -32776,7 +30858,6 @@ export interface SandboxBankIncomeWebhookFireRequestWebhookFields { * @export * @interface SandboxBankTransferFireWebhookRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankTransferFireWebhookRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -32802,10 +30883,7 @@ export interface SandboxBankTransferFireWebhookRequest { * @export * @interface SandboxBankTransferFireWebhookResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankTransferFireWebhookResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32818,7 +30896,6 @@ export interface SandboxBankTransferFireWebhookResponse { * @export * @interface SandboxBankTransferSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankTransferSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -32856,10 +30933,7 @@ export interface SandboxBankTransferSimulateRequest { * @export * @interface SandboxBankTransferSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxBankTransferSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32872,7 +30946,6 @@ export interface SandboxBankTransferSimulateResponse { * @export * @interface SandboxIncomeFireWebhookRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxIncomeFireWebhookRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -32933,10 +31006,7 @@ export enum SandboxIncomeFireWebhookRequestVerificationStatusEnum { * @export * @interface SandboxIncomeFireWebhookResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxIncomeFireWebhookResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32959,7 +31029,6 @@ export enum SandboxIncomeWebhookFireRequestWebhookCode { * @export * @interface SandboxItemFireWebhookRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemFireWebhookRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33013,10 +31082,7 @@ export enum SandboxItemFireWebhookRequestWebhookCodeEnum { * @export * @interface SandboxItemFireWebhookResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemFireWebhookResponse { - [key: string]: object | unknown; - /** * Value is `true` if the test` webhook_code` was successfully fired. * @type {boolean} @@ -33035,7 +31101,6 @@ export interface SandboxItemFireWebhookResponse { * @export * @interface SandboxItemResetLoginRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemResetLoginRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33061,10 +31126,7 @@ export interface SandboxItemResetLoginRequest { * @export * @interface SandboxItemResetLoginResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemResetLoginResponse { - [key: string]: object | unknown; - /** * `true` if the call succeeded * @type {boolean} @@ -33083,7 +31145,6 @@ export interface SandboxItemResetLoginResponse { * @export * @interface SandboxItemSetVerificationStatusRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemSetVerificationStatusRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33131,10 +31192,7 @@ export enum SandboxItemSetVerificationStatusRequestVerificationStatusEnum { * @export * @interface SandboxItemSetVerificationStatusResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxItemSetVerificationStatusResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33147,7 +31205,6 @@ export interface SandboxItemSetVerificationStatusResponse { * @export * @interface SandboxOauthSelectAccountsRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxOauthSelectAccountsRequest { /** * @@ -33167,7 +31224,6 @@ export interface SandboxOauthSelectAccountsRequest { * @export * @interface SandboxPaymentProfileResetLoginRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPaymentProfileResetLoginRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33193,10 +31249,7 @@ export interface SandboxPaymentProfileResetLoginRequest { * @export * @interface SandboxPaymentProfileResetLoginResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPaymentProfileResetLoginResponse { - [key: string]: object | unknown; - /** * `true` if the call succeeded * @type {boolean} @@ -33215,7 +31268,6 @@ export interface SandboxPaymentProfileResetLoginResponse { * @export * @interface SandboxProcessorTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxProcessorTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33247,7 +31299,6 @@ export interface SandboxProcessorTokenCreateRequest { * @export * @interface SandboxProcessorTokenCreateRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface SandboxProcessorTokenCreateRequestOptions { /** * Test username to use for the creation of the Sandbox Item. Default value is `user_good`. @@ -33267,10 +31318,7 @@ export interface SandboxProcessorTokenCreateRequestOptions { * @export * @interface SandboxProcessorTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxProcessorTokenCreateResponse { - [key: string]: object | unknown; - /** * A processor token that can be used to call the `/processor/` endpoints. * @type {string} @@ -33289,7 +31337,6 @@ export interface SandboxProcessorTokenCreateResponse { * @export * @interface SandboxPublicTokenCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33333,7 +31380,6 @@ export interface SandboxPublicTokenCreateRequest { * @export * @interface SandboxPublicTokenCreateRequestIncomeVerificationBankIncome */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateRequestIncomeVerificationBankIncome { /** * The number of days of data to request for the Bank Income product @@ -33347,7 +31393,6 @@ export interface SandboxPublicTokenCreateRequestIncomeVerificationBankIncome { * @export * @interface SandboxPublicTokenCreateRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateRequestOptions { /** * Specify a webhook to associate with the new Item. @@ -33385,7 +31430,6 @@ export interface SandboxPublicTokenCreateRequestOptions { * @export * @interface SandboxPublicTokenCreateRequestOptionsIncomeVerification */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateRequestOptionsIncomeVerification { /** * The types of source income data that users will be permitted to share. Options include `bank` and `payroll`. Currently you can only specify one of these options. @@ -33405,7 +31449,6 @@ export interface SandboxPublicTokenCreateRequestOptionsIncomeVerification { * @export * @interface SandboxPublicTokenCreateRequestOptionsTransactions */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateRequestOptionsTransactions { /** * The earliest date for which to fetch transaction history. Dates should be formatted as YYYY-MM-DD. @@ -33431,10 +31474,7 @@ export interface SandboxPublicTokenCreateRequestOptionsTransactions { * @export * @interface SandboxPublicTokenCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxPublicTokenCreateResponse { - [key: string]: object | unknown; - /** * A public token that can be exchanged for an access token using `/item/public_token/exchange` * @type {string} @@ -33453,7 +31493,6 @@ export interface SandboxPublicTokenCreateResponse { * @export * @interface SandboxTransferFireWebhookRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferFireWebhookRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33479,10 +31518,7 @@ export interface SandboxTransferFireWebhookRequest { * @export * @interface SandboxTransferFireWebhookResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferFireWebhookResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33495,7 +31531,6 @@ export interface SandboxTransferFireWebhookResponse { * @export * @interface SandboxTransferLedgerDepositSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerDepositSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33533,10 +31568,7 @@ export interface SandboxTransferLedgerDepositSimulateRequest { * @export * @interface SandboxTransferLedgerDepositSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerDepositSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33549,7 +31581,6 @@ export interface SandboxTransferLedgerDepositSimulateResponse { * @export * @interface SandboxTransferLedgerSimulateAvailableRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerSimulateAvailableRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33575,10 +31606,7 @@ export interface SandboxTransferLedgerSimulateAvailableRequest { * @export * @interface SandboxTransferLedgerSimulateAvailableResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerSimulateAvailableResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33591,7 +31619,6 @@ export interface SandboxTransferLedgerSimulateAvailableResponse { * @export * @interface SandboxTransferLedgerWithdrawSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerWithdrawSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33629,10 +31656,7 @@ export interface SandboxTransferLedgerWithdrawSimulateRequest { * @export * @interface SandboxTransferLedgerWithdrawSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferLedgerWithdrawSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33645,7 +31669,6 @@ export interface SandboxTransferLedgerWithdrawSimulateResponse { * @export * @interface SandboxTransferRefundSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferRefundSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33689,10 +31712,7 @@ export interface SandboxTransferRefundSimulateRequest { * @export * @interface SandboxTransferRefundSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferRefundSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33705,7 +31725,6 @@ export interface SandboxTransferRefundSimulateResponse { * @export * @interface SandboxTransferRepaymentSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferRepaymentSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33725,10 +31744,7 @@ export interface SandboxTransferRepaymentSimulateRequest { * @export * @interface SandboxTransferRepaymentSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferRepaymentSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33741,7 +31757,6 @@ export interface SandboxTransferRepaymentSimulateResponse { * @export * @interface SandboxTransferSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33785,10 +31800,7 @@ export interface SandboxTransferSimulateRequest { * @export * @interface SandboxTransferSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferSimulateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33801,7 +31813,6 @@ export interface SandboxTransferSimulateResponse { * @export * @interface SandboxTransferSweepSimulateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferSweepSimulateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33827,10 +31838,7 @@ export interface SandboxTransferSweepSimulateRequest { * @export * @interface SandboxTransferSweepSimulateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferSweepSimulateResponse { - [key: string]: object | unknown; - /** * * @type {SimulatedTransferSweep} @@ -33849,7 +31857,6 @@ export interface SandboxTransferSweepSimulateResponse { * @export * @interface SandboxTransferTestClockAdvanceRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockAdvanceRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33881,10 +31888,7 @@ export interface SandboxTransferTestClockAdvanceRequest { * @export * @interface SandboxTransferTestClockAdvanceResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockAdvanceResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33897,7 +31901,6 @@ export interface SandboxTransferTestClockAdvanceResponse { * @export * @interface SandboxTransferTestClockCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33923,10 +31926,7 @@ export interface SandboxTransferTestClockCreateRequest { * @export * @interface SandboxTransferTestClockCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockCreateResponse { - [key: string]: object | unknown; - /** * * @type {TransferTestClock} @@ -33945,7 +31945,6 @@ export interface SandboxTransferTestClockCreateResponse { * @export * @interface SandboxTransferTestClockGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -33971,10 +31970,7 @@ export interface SandboxTransferTestClockGetRequest { * @export * @interface SandboxTransferTestClockGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferTestClock} @@ -33993,7 +31989,6 @@ export interface SandboxTransferTestClockGetResponse { * @export * @interface SandboxTransferTestClockListRequest */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -34037,10 +32032,7 @@ export interface SandboxTransferTestClockListRequest { * @export * @interface SandboxTransferTestClockListResponse */ -// Edited by Plaid, line 9. any to unknown export interface SandboxTransferTestClockListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -34059,7 +32051,6 @@ export interface SandboxTransferTestClockListResponse { * @export * @interface Scopes */ -// Edited by Plaid, line 9. any to unknown export interface Scopes { /** * @@ -34095,7 +32086,6 @@ export enum ScopesContext { * @export * @interface ScopesNullable */ -// Edited by Plaid, line 9. any to unknown export interface ScopesNullable { /** * @@ -34121,10 +32111,7 @@ export interface ScopesNullable { * @export * @interface ScreeningHitAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningHitAnalysis { - [key: string]: object | unknown; - /** * * @type {MatchSummaryCode} @@ -34161,10 +32148,7 @@ export interface ScreeningHitAnalysis { * @export * @interface ScreeningHitData */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningHitData { - [key: string]: object | unknown; - /** * Dates of birth associated with the watchlist hit * @type {Array} @@ -34195,10 +32179,7 @@ export interface ScreeningHitData { * @export * @interface ScreeningHitDateOfBirthItem */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningHitDateOfBirthItem { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -34217,10 +32198,7 @@ export interface ScreeningHitDateOfBirthItem { * @export * @interface ScreeningHitDocumentsItems */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningHitDocumentsItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -34239,10 +32217,7 @@ export interface ScreeningHitDocumentsItems { * @export * @interface ScreeningHitNamesItems */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningHitNamesItems { - [key: string]: object | unknown; - /** * * @type {MatchSummary} @@ -34261,10 +32236,7 @@ export interface ScreeningHitNamesItems { * @export * @interface ScreeningStatusUpdatedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface ScreeningStatusUpdatedWebhook { - [key: string]: object | unknown; - /** * `SCREENING` * @type {string} @@ -34295,10 +32267,7 @@ export interface ScreeningStatusUpdatedWebhook { * @export * @interface Security */ -// Edited by Plaid, line 9. any to unknown export interface Security { - [key: string]: object | unknown; - /** * A unique, Plaid-specific identifier for the security, used to associate securities with holdings. Like all Plaid identifiers, the `security_id` is case sensitive. The `security_id` may change if inherent details of the security change due to a corporate action, for example, in the event of a ticker symbol change or CUSIP change. * @type {string} @@ -34413,7 +32382,6 @@ export interface Security { * @export * @interface SecurityOverride */ -// Edited by Plaid, line 9. any to unknown export interface SecurityOverride { /** * 12-character ISIN, a globally unique securities identifier. A verified CUSIP Global Services license is required to receive this data. This field will be null by default for new customers, and null for existing customers starting March 12, 2024. If you would like access to this field, please start the verification process [here](https://docs.google.com/forms/d/e/1FAIpQLSd9asHEYEfmf8fxJTHZTAfAzW4dugsnSu-HS2J51f1mxwd6Sw/viewform). @@ -34457,10 +32425,7 @@ export interface SecurityOverride { * @export * @interface SelfieAnalysis */ -// Edited by Plaid, line 9. any to unknown export interface SelfieAnalysis { - [key: string]: object | unknown; - /** * * @type {SelfieAnalysisDocumentComparison} @@ -34484,10 +32449,7 @@ export enum SelfieAnalysisDocumentComparison { * @export * @interface SelfieCapture */ -// Edited by Plaid, line 9. any to unknown export interface SelfieCapture { - [key: string]: object | unknown; - /** * Temporary URL for downloading an image selfie capture. * @type {string} @@ -34506,10 +32468,7 @@ export interface SelfieCapture { * @export * @interface SelfieCheck */ -// Edited by Plaid, line 9. any to unknown export interface SelfieCheck { - [key: string]: object | unknown; - /** * * @type {SelfieCheckStatus} @@ -34528,10 +32487,7 @@ export interface SelfieCheck { * @export * @interface SelfieCheckSelfie */ -// Edited by Plaid, line 9. any to unknown export interface SelfieCheckSelfie { - [key: string]: object | unknown; - /** * * @type {SelfieStatus} @@ -34582,7 +32538,6 @@ export enum SelfieStatus { * @export * @interface SenderBACSNullable */ -// Edited by Plaid, line 9. any to unknown export interface SenderBACSNullable { /** * The account number of the account. Maximum of 10 characters. @@ -34602,10 +32557,7 @@ export interface SenderBACSNullable { * @export * @interface Service */ -// Edited by Plaid, line 9. any to unknown export interface Service { - [key: string]: object | unknown; - /** * * @type {VerificationOfAsset} @@ -34624,10 +32576,7 @@ export interface Service { * @export * @interface ServiceProductFulfillment */ -// Edited by Plaid, line 9. any to unknown export interface ServiceProductFulfillment { - [key: string]: object | unknown; - /** * * @type {ServiceProductFulfillmentDetail} @@ -34640,10 +32589,7 @@ export interface ServiceProductFulfillment { * @export * @interface ServiceProductFulfillmentDetail */ -// Edited by Plaid, line 9. any to unknown export interface ServiceProductFulfillmentDetail { - [key: string]: object | unknown; - /** * A string that uniquely identifies a type of order Verification of Asset. * @type {string} @@ -34672,10 +32618,7 @@ export enum ServiceProductFulfillmentIdentifier { * @export * @interface ServicerAddressData */ -// Edited by Plaid, line 9. any to unknown export interface ServicerAddressData { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -34712,10 +32655,7 @@ export interface ServicerAddressData { * @export * @interface Services */ -// Edited by Plaid, line 9. any to unknown export interface Services { - [key: string]: object | unknown; - /** * * @type {Service} @@ -34728,10 +32668,7 @@ export interface Services { * @export * @interface SignalAddressData */ -// Edited by Plaid, line 9. any to unknown export interface SignalAddressData { - [key: string]: object | unknown; - /** * The full city name * @type {string} @@ -34781,7 +32718,6 @@ export enum SignalDecisionOutcome { * @export * @interface SignalDecisionReportRequest */ -// Edited by Plaid, line 9. any to unknown export interface SignalDecisionReportRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -34837,10 +32773,7 @@ export interface SignalDecisionReportRequest { * @export * @interface SignalDecisionReportResponse */ -// Edited by Plaid, line 9. any to unknown export interface SignalDecisionReportResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -34853,7 +32786,6 @@ export interface SignalDecisionReportResponse { * @export * @interface SignalDevice */ -// Edited by Plaid, line 9. any to unknown export interface SignalDevice { /** * The IP address of the device that initiated the transaction @@ -34873,7 +32805,6 @@ export interface SignalDevice { * @export * @interface SignalEvaluateCoreAttributes */ -// Edited by Plaid, line 9. any to unknown export interface SignalEvaluateCoreAttributes { /** * We parse and analyze historical transaction metadata to identify the number of possible past returns due to unauthorized transactions over the past 7 days from the account that will be debited. @@ -35283,7 +33214,6 @@ export interface SignalEvaluateCoreAttributes { * @export * @interface SignalEvaluateRequest */ -// Edited by Plaid, line 9. any to unknown export interface SignalEvaluateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -35369,10 +33299,7 @@ export interface SignalEvaluateRequest { * @export * @interface SignalEvaluateResponse */ -// Edited by Plaid, line 9. any to unknown export interface SignalEvaluateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -35423,7 +33350,6 @@ export enum SignalPaymentMethod { * @export * @interface SignalPersonName */ -// Edited by Plaid, line 9. any to unknown export interface SignalPersonName { /** * The user\'s name prefix (e.g. \"Mr.\") @@ -35461,7 +33387,6 @@ export interface SignalPersonName { * @export * @interface SignalPrepareRequest */ -// Edited by Plaid, line 9. any to unknown export interface SignalPrepareRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -35487,10 +33412,7 @@ export interface SignalPrepareRequest { * @export * @interface SignalPrepareResponse */ -// Edited by Plaid, line 9. any to unknown export interface SignalPrepareResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -35503,7 +33425,6 @@ export interface SignalPrepareResponse { * @export * @interface SignalReturnReportRequest */ -// Edited by Plaid, line 9. any to unknown export interface SignalReturnReportRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -35541,10 +33462,7 @@ export interface SignalReturnReportRequest { * @export * @interface SignalReturnReportResponse */ -// Edited by Plaid, line 9. any to unknown export interface SignalReturnReportResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -35557,10 +33475,7 @@ export interface SignalReturnReportResponse { * @export * @interface SignalScores */ -// Edited by Plaid, line 9. any to unknown export interface SignalScores { - [key: string]: object | unknown; - /** * * @type {CustomerInitiatedReturnRisk} @@ -35579,7 +33494,6 @@ export interface SignalScores { * @export * @interface SignalUser */ -// Edited by Plaid, line 9. any to unknown export interface SignalUser { /** * @@ -35611,7 +33525,6 @@ export interface SignalUser { * @export * @interface SignalWarning */ -// Edited by Plaid, line 9. any to unknown export interface SignalWarning { /** * A broad categorization of the warning. Safe for programmatic use. @@ -35637,7 +33550,6 @@ export interface SignalWarning { * @export * @interface SimulatedTransferSweep */ -// Edited by Plaid, line 9. any to unknown export interface SimulatedTransferSweep { /** * Identifier of the sweep. @@ -35705,10 +33617,7 @@ export interface SimulatedTransferSweep { * @export * @interface SingleDocumentRiskSignal */ -// Edited by Plaid, line 9. any to unknown export interface SingleDocumentRiskSignal { - [key: string]: object | unknown; - /** * * @type {RiskSignalDocumentReference} @@ -35745,10 +33654,7 @@ export enum Source { * @export * @interface StandaloneAccountType */ -// Edited by Plaid, line 9. any to unknown export interface StandaloneAccountType { - [key: string]: object | unknown; - /** * An account type holding cash, in which funds are deposited. Supported products for `depository` accounts are: Auth (`checking` and `savings` types only), Balance, Transactions, Identity, Payment Initiation, Assets, and Investments (`cash management` type only). * @type {string} @@ -35785,10 +33691,7 @@ export interface StandaloneAccountType { * @export * @interface StandaloneCurrencyCodeList */ -// Edited by Plaid, line 9. any to unknown export interface StandaloneCurrencyCodeList { - [key: string]: object | unknown; - /** * Plaid supports all ISO 4217 currency codes. * @type {string} @@ -35807,10 +33710,7 @@ export interface StandaloneCurrencyCodeList { * @export * @interface StandaloneInvestmentTransactionType */ -// Edited by Plaid, line 9. any to unknown export interface StandaloneInvestmentTransactionType { - [key: string]: object | unknown; - /** * Buying an investment * @type {string} @@ -35853,10 +33753,7 @@ export interface StandaloneInvestmentTransactionType { * @export * @interface StatementsAccount */ -// Edited by Plaid, line 9. any to unknown export interface StatementsAccount { - [key: string]: object | unknown; - /** * Plaid\'s unique identifier for the account. * @type {string} @@ -35905,7 +33802,6 @@ export interface StatementsAccount { * @export * @interface StatementsDownloadRequest */ -// Edited by Plaid, line 9. any to unknown export interface StatementsDownloadRequest { /** * The access token associated with the Item data is being requested for. @@ -35937,7 +33833,6 @@ export interface StatementsDownloadRequest { * @export * @interface StatementsListRequest */ -// Edited by Plaid, line 9. any to unknown export interface StatementsListRequest { /** * The access token associated with the Item data is being requested for. @@ -35963,10 +33858,7 @@ export interface StatementsListRequest { * @export * @interface StatementsListResponse */ -// Edited by Plaid, line 9. any to unknown export interface StatementsListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -36013,10 +33905,7 @@ export enum StatementsRefreshCompleteResult { * @export * @interface StatementsRefreshCompleteWebhook */ -// Edited by Plaid, line 9. any to unknown export interface StatementsRefreshCompleteWebhook { - [key: string]: object | unknown; - /** * `STATEMENTS` * @type {string} @@ -36053,7 +33942,6 @@ export interface StatementsRefreshCompleteWebhook { * @export * @interface StatementsRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface StatementsRefreshRequest { /** * The access token associated with the Item data is being requested for. @@ -36091,10 +33979,7 @@ export interface StatementsRefreshRequest { * @export * @interface StatementsRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface StatementsRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -36107,10 +33992,7 @@ export interface StatementsRefreshResponse { * @export * @interface StatementsStatement */ -// Edited by Plaid, line 9. any to unknown export interface StatementsStatement { - [key: string]: object | unknown; - /** * Plaid\'s unique identifier for the statement. * @type {string} @@ -36135,10 +34017,7 @@ export interface StatementsStatement { * @export * @interface Status */ -// Edited by Plaid, line 9. any to unknown export interface Status { - [key: string]: object | unknown; - /** * Satus Code. * @type {string} @@ -36157,10 +34036,7 @@ export interface Status { * @export * @interface Statuses */ -// Edited by Plaid, line 9. any to unknown export interface Statuses { - [key: string]: object | unknown; - /** * * @type {Status} @@ -36185,10 +34061,7 @@ export enum Strategy { * @export * @interface StudentLoan */ -// Edited by Plaid, line 9. any to unknown export interface StudentLoan { - [key: string]: object | unknown; - /** * The ID of the account that this liability belongs to. * @type {string} @@ -36339,10 +34212,7 @@ export interface StudentLoan { * @export * @interface StudentLoanRepaymentModel */ -// Edited by Plaid, line 9. any to unknown export interface StudentLoanRepaymentModel { - [key: string]: object | unknown; - /** * The only currently supported value for this field is `standard`. * @type {string} @@ -36367,10 +34237,7 @@ export interface StudentLoanRepaymentModel { * @export * @interface StudentLoanStatus */ -// Edited by Plaid, line 9. any to unknown export interface StudentLoanStatus { - [key: string]: object | unknown; - /** * The date until which the loan will be in its current status. Dates are returned in an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD). * @type {string} @@ -36415,10 +34282,7 @@ export enum StudentLoanStatusTypeEnum { * @export * @interface StudentRepaymentPlan */ -// Edited by Plaid, line 9. any to unknown export interface StudentRepaymentPlan { - [key: string]: object | unknown; - /** * The description of the repayment plan as provided by the servicer. * @type {string} @@ -36483,10 +34347,7 @@ export enum SweepTrigger { * @export * @interface SyncUpdatesAvailableWebhook */ -// Edited by Plaid, line 9. any to unknown export interface SyncUpdatesAvailableWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -36529,10 +34390,7 @@ export interface SyncUpdatesAvailableWebhook { * @export * @interface Taxform */ -// Edited by Plaid, line 9. any to unknown export interface Taxform { - [key: string]: object | unknown; - /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -36557,10 +34415,7 @@ export interface Taxform { * @export * @interface TaxpayerID */ -// Edited by Plaid, line 9. any to unknown export interface TaxpayerID { - [key: string]: object | unknown; - /** * Type of ID, e.g. \'SSN\' * @type {string} @@ -36586,10 +34441,7 @@ export interface TaxpayerID { * @export * @interface TaxpayerIdentifier */ -// Edited by Plaid, line 9. any to unknown export interface TaxpayerIdentifier { - [key: string]: object | unknown; - /** * * @type {TaxpayerIdentifierType} @@ -36618,10 +34470,7 @@ export enum TaxpayerIdentifierType { * @export * @interface TaxpayerIdentifiers */ -// Edited by Plaid, line 9. any to unknown export interface TaxpayerIdentifiers { - [key: string]: object | unknown; - /** * * @type {TaxpayerIdentifier} @@ -36634,10 +34483,7 @@ export interface TaxpayerIdentifiers { * @export * @interface Total */ -// Edited by Plaid, line 9. any to unknown export interface Total { - [key: string]: object | unknown; - /** * * @type {TotalCanonicalDescription} @@ -36695,7 +34541,6 @@ export enum TotalCanonicalDescription { * @export * @interface Transaction */ -// Edited by Plaid, line 9. any to unknown export interface Transaction { /** * The ID of the account in which this transaction occurred. @@ -36901,7 +34746,6 @@ export enum TransactionPaymentChannelEnum { * @export * @interface TransactionAllOf */ -// Edited by Plaid, line 9. any to unknown export interface TransactionAllOf { /** * The date that the transaction was authorized. For posted transactions, the `date` field will indicate the posted date, but `authorized_date` will indicate the day the transaction was authorized by the financial institution. If presenting transactions to the user in a UI, the `authorized_date`, when available, is generally preferable to use over the `date` field for posted transactions, as it will generally represent the date the user actually made the transaction. Dates are returned in an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format ( `YYYY-MM-DD` ). @@ -36974,10 +34818,7 @@ export enum TransactionAllOfPaymentChannelEnum { * @export * @interface TransactionBase */ -// Edited by Plaid, line 9. any to unknown export interface TransactionBase { - [key: string]: object | unknown; - /** * The ID of the account in which this transaction occurred. * @type {string} @@ -37140,10 +34981,7 @@ export enum TransactionCode { * @export * @interface TransactionCounterparty */ -// Edited by Plaid, line 9. any to unknown export interface TransactionCounterparty { - [key: string]: object | unknown; - /** * The name of the counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -37186,10 +35024,7 @@ export interface TransactionCounterparty { * @export * @interface TransactionData */ -// Edited by Plaid, line 9. any to unknown export interface TransactionData { - [key: string]: object | unknown; - /** * The description of the transaction. * @type {string} @@ -37226,10 +35061,7 @@ export interface TransactionData { * @export * @interface TransactionOverride */ -// Edited by Plaid, line 9. any to unknown export interface TransactionOverride { - [key: string]: object | unknown; - /** * The date of the transaction, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) (YYYY-MM-DD) format. Transactions in Sandbox will move from pending to posted once their transaction date has been reached. If a `date_transacted` is not provided by the institution, a transaction date may be available in the [`authorized_date`](https://plaid.com/docs/api/products/transactions/#transactions-get-response-transactions-authorized-date) field. * @type {string} @@ -37266,10 +35098,7 @@ export interface TransactionOverride { * @export * @interface TransactionStream */ -// Edited by Plaid, line 9. any to unknown export interface TransactionStream { - [key: string]: object | unknown; - /** * The ID of the account to which the stream belongs * @type {string} @@ -37380,10 +35209,7 @@ export interface TransactionStream { * @export * @interface TransactionStreamAmount */ -// Edited by Plaid, line 9. any to unknown export interface TransactionStreamAmount { - [key: string]: object | unknown; - /** * Represents the numerical value of an amount. * @type {number} @@ -37420,7 +35246,6 @@ export enum TransactionStreamStatus { * @export * @interface TransactionsCategoryRule */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsCategoryRule { /** * A unique identifier of the rule created @@ -37458,7 +35283,6 @@ export interface TransactionsCategoryRule { * @export * @interface TransactionsEnhanceGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsEnhanceGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37490,10 +35314,7 @@ export interface TransactionsEnhanceGetRequest { * @export * @interface TransactionsEnhanceGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsEnhanceGetResponse { - [key: string]: object | unknown; - /** * An array of enhanced transactions. * @type {Array} @@ -37506,7 +35327,6 @@ export interface TransactionsEnhanceGetResponse { * @export * @interface TransactionsEnrichRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsEnrichRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37544,7 +35364,6 @@ export interface TransactionsEnrichRequest { * @export * @interface TransactionsEnrichRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsEnrichRequestOptions { /** * Include `legacy_category` and `legacy_category_id` in the response (in addition to the default `personal_finance_category`). Categories are based on Plaid\'s legacy taxonomy. For a full list of legacy categories, see [`/categories/get`](https://plaid.com/docs/api/products/transactions/#categoriesget). @@ -37558,10 +35377,7 @@ export interface TransactionsEnrichRequestOptions { * @export * @interface TransactionsEnrichResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsEnrichResponse { - [key: string]: object | unknown; - /** * A list of enriched transactions. * @type {Array} @@ -37580,7 +35396,6 @@ export interface TransactionsEnrichResponse { * @export * @interface TransactionsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37624,7 +35439,6 @@ export interface TransactionsGetRequest { * @export * @interface TransactionsGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsGetRequestOptions { /** * A list of `account_ids` to retrieve for the Item Note: An error will be returned if a provided `account_id` is not associated with the Item. @@ -37683,10 +35497,7 @@ export interface TransactionsGetRequestOptions { * @export * @interface TransactionsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsGetResponse { - [key: string]: object | unknown; - /** * An array containing the `accounts` associated with the Item for which transactions are being returned. Each transaction can be mapped to its corresponding account via the `account_id` field. * @type {Array} @@ -37723,7 +35534,6 @@ export interface TransactionsGetResponse { * @export * @interface TransactionsRecurringCreateInput */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringCreateInput { /** * IDs of all the transactions that will be merged into one stream. If any transaction currently exists in another stream, it will be removed from the other stream. @@ -37737,7 +35547,6 @@ export interface TransactionsRecurringCreateInput { * @export * @interface TransactionsRecurringCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37769,10 +35578,7 @@ export interface TransactionsRecurringCreateRequest { * @export * @interface TransactionsRecurringCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringCreateResponse { - [key: string]: object | unknown; - /** * Streams created as a result of the operation. * @type {Array} @@ -37797,7 +35603,6 @@ export interface TransactionsRecurringCreateResponse { * @export * @interface TransactionsRecurringGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37835,7 +35640,6 @@ export interface TransactionsRecurringGetRequest { * @export * @interface TransactionsRecurringGetRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringGetRequestOptions { /** * Personal finance categories are now returned by default. @@ -37850,10 +35654,7 @@ export interface TransactionsRecurringGetRequestOptions { * @export * @interface TransactionsRecurringGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringGetResponse { - [key: string]: object | unknown; - /** * An array of depository transaction streams. * @type {Array} @@ -37884,7 +35685,6 @@ export interface TransactionsRecurringGetResponse { * @export * @interface TransactionsRecurringMergeInput */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringMergeInput { /** * IDs of all the streams that will be merged into the first stream. This operation will retain the stream_id of the first stream. @@ -37898,7 +35698,6 @@ export interface TransactionsRecurringMergeInput { * @export * @interface TransactionsRecurringMergeRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringMergeRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -37930,10 +35729,7 @@ export interface TransactionsRecurringMergeRequest { * @export * @interface TransactionsRecurringMergeResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringMergeResponse { - [key: string]: object | unknown; - /** * Directly modified stream, along with other streams with transactions removed from them as a result of the operation (in no particular order). * @type {Array} @@ -37952,7 +35748,6 @@ export interface TransactionsRecurringMergeResponse { * @export * @interface TransactionsRecurringUpdateInput */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringUpdateInput { /** * ID of the stream that all the transactions will be added in to. @@ -37972,7 +35767,6 @@ export interface TransactionsRecurringUpdateInput { * @export * @interface TransactionsRecurringUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38004,10 +35798,7 @@ export interface TransactionsRecurringUpdateRequest { * @export * @interface TransactionsRecurringUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRecurringUpdateResponse { - [key: string]: object | unknown; - /** * Directly modified stream, along with other streams with transactions removed from them as a result of the operation (in no particular order). * @type {Array} @@ -38026,7 +35817,6 @@ export interface TransactionsRecurringUpdateResponse { * @export * @interface TransactionsRefreshRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRefreshRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38052,10 +35842,7 @@ export interface TransactionsRefreshRequest { * @export * @interface TransactionsRefreshResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRefreshResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -38068,10 +35855,7 @@ export interface TransactionsRefreshResponse { * @export * @interface TransactionsRemovedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRemovedWebhook { - [key: string]: object | unknown; - /** * `TRANSACTIONS` * @type {string} @@ -38114,7 +35898,6 @@ export interface TransactionsRemovedWebhook { * @export * @interface TransactionsRuleDetails */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRuleDetails { /** * @@ -38160,7 +35943,6 @@ export enum TransactionsRuleType { * @export * @interface TransactionsRulesCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38198,10 +35980,7 @@ export interface TransactionsRulesCreateRequest { * @export * @interface TransactionsRulesCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesCreateResponse { - [key: string]: object | unknown; - /** * * @type {TransactionsCategoryRule} @@ -38220,7 +35999,6 @@ export interface TransactionsRulesCreateResponse { * @export * @interface TransactionsRulesListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38246,10 +36024,7 @@ export interface TransactionsRulesListRequest { * @export * @interface TransactionsRulesListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesListResponse { - [key: string]: object | unknown; - /** * A list of the Item\'s transaction rules * @type {Array} @@ -38268,7 +36043,6 @@ export interface TransactionsRulesListResponse { * @export * @interface TransactionsRulesRemoveRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesRemoveRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38300,10 +36074,7 @@ export interface TransactionsRulesRemoveRequest { * @export * @interface TransactionsRulesRemoveResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsRulesRemoveResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -38316,7 +36087,6 @@ export interface TransactionsRulesRemoveResponse { * @export * @interface TransactionsSyncRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsSyncRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38360,7 +36130,6 @@ export interface TransactionsSyncRequest { * @export * @interface TransactionsSyncRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsSyncRequestOptions { /** * Include the raw unparsed transaction description from the financial institution. This field is disabled by default. If you need this information in addition to the parsed data provided, contact your Plaid Account Manager or submit a [Support request](https://dashboard.plaid.com/support/new/product-and-development/product-troubleshooting/product-functionality). @@ -38394,10 +36163,7 @@ export interface TransactionsSyncRequestOptions { * @export * @interface TransactionsSyncResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsSyncResponse { - [key: string]: object | unknown; - /** * Transactions that have been added to the Item since `cursor` ordered by ascending last modified time. * @type {Array} @@ -38440,7 +36206,6 @@ export interface TransactionsSyncResponse { * @export * @interface TransactionsUserInsightsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsUserInsightsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38466,10 +36231,7 @@ export interface TransactionsUserInsightsGetRequest { * @export * @interface TransactionsUserInsightsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransactionsUserInsightsGetResponse { - [key: string]: object | unknown; - /** * * @type {UserDataOverview} @@ -38500,10 +36262,7 @@ export interface TransactionsUserInsightsGetResponse { * @export * @interface Transfer */ -// Edited by Plaid, line 9. any to unknown export interface Transfer { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a transfer. * @type {string} @@ -38702,10 +36461,7 @@ export enum TransferACHNetwork { * @export * @interface TransferAuthorization */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorization { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a transfer authorization. * @type {string} @@ -38760,7 +36516,6 @@ export interface TransferAuthorization { * @export * @interface TransferAuthorizationCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -38896,10 +36651,7 @@ export interface TransferAuthorizationCreateRequest { * @export * @interface TransferAuthorizationCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationCreateResponse { - [key: string]: object | unknown; - /** * * @type {TransferAuthorization} @@ -38928,10 +36680,7 @@ export enum TransferAuthorizationDecision { * @export * @interface TransferAuthorizationDecisionRationale */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationDecisionRationale { - [key: string]: object | unknown; - /** * * @type {TransferAuthorizationDecisionRationaleCode} @@ -38967,10 +36716,7 @@ export enum TransferAuthorizationDecisionRationaleCode { * @export * @interface TransferAuthorizationDevice */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationDevice { - [key: string]: object | unknown; - /** * The IP address of the device being used to initiate the authorization. * @type {string} @@ -39000,10 +36746,7 @@ export enum TransferAuthorizationGuaranteeDecision { * @export * @interface TransferAuthorizationGuaranteeDecisionRationale */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationGuaranteeDecisionRationale { - [key: string]: object | unknown; - /** * * @type {TransferAuthorizationGuaranteeDecisionRationaleCode} @@ -39035,10 +36778,7 @@ export enum TransferAuthorizationGuaranteeDecisionRationaleCode { * @export * @interface TransferAuthorizationPaymentRisk */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationPaymentRisk { - [key: string]: object | unknown; - /** * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk because an account is overdrawn or because an ineligible account is used and covers return codes: \"R01\", \"R02\", \"R03\", \"R04\", \"R06\", \"R08\", \"R09\", \"R13\", \"R16\", \"R17\", \"R20\", \"R23\". These returns have a turnaround time of 2 banking days. * @type {number} @@ -39069,10 +36809,7 @@ export interface TransferAuthorizationPaymentRisk { * @export * @interface TransferAuthorizationProposedTransfer */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationProposedTransfer { - [key: string]: object | unknown; - /** * * @type {ACHClass} @@ -39160,7 +36897,6 @@ export enum TransferAuthorizationRiskLevel { * @export * @interface TransferAuthorizationUserInRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferAuthorizationUserInRequest { /** * The user\'s legal name. If the user is a business, provide the business name. @@ -39192,10 +36928,7 @@ export interface TransferAuthorizationUserInRequest { * @export * @interface TransferBalance */ -// Edited by Plaid, line 9. any to unknown export interface TransferBalance { - [key: string]: object | unknown; - /** * The amount of this balance available for use (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} @@ -39220,7 +36953,6 @@ export interface TransferBalance { * @export * @interface TransferBalanceGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferBalanceGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39253,10 +36985,7 @@ export interface TransferBalanceGetRequest { * @export * @interface TransferBalanceGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferBalanceGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferBalance} @@ -39285,7 +37014,6 @@ export enum TransferBalanceType { * @export * @interface TransferCancelRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferCancelRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39318,10 +37046,7 @@ export interface TransferCancelRequest { * @export * @interface TransferCancelResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferCancelResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39334,10 +37059,7 @@ export interface TransferCancelResponse { * @export * @interface TransferCapabilitiesGetRTP */ -// Edited by Plaid, line 9. any to unknown export interface TransferCapabilitiesGetRTP { - [key: string]: object | unknown; - /** * When `true`, the linked Item\'s institution supports RTP credit transfer. * @type {boolean} @@ -39350,7 +37072,6 @@ export interface TransferCapabilitiesGetRTP { * @export * @interface TransferCapabilitiesGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferCapabilitiesGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39388,10 +37109,7 @@ export interface TransferCapabilitiesGetRequest { * @export * @interface TransferCapabilitiesGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferCapabilitiesGetResponse { - [key: string]: object | unknown; - /** * * @type {InstitutionSupportedNetworks} @@ -39410,7 +37128,6 @@ export interface TransferCapabilitiesGetResponse { * @export * @interface TransferConfigurationGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferConfigurationGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39436,10 +37153,7 @@ export interface TransferConfigurationGetRequest { * @export * @interface TransferConfigurationGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferConfigurationGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39508,7 +37222,6 @@ export interface TransferConfigurationGetResponse { * @export * @interface TransferCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39625,10 +37338,7 @@ export interface TransferCreateRequest { * @export * @interface TransferCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferCreateResponse { - [key: string]: object | unknown; - /** * * @type {Transfer} @@ -39659,7 +37369,6 @@ export enum TransferCreditFundsSource { * @export * @interface TransferCreditUsageConfiguration */ -// Edited by Plaid, line 9. any to unknown export interface TransferCreditUsageConfiguration { /** * @@ -39697,7 +37406,6 @@ export interface TransferCreditUsageConfiguration { * @export * @interface TransferDebitUsageConfiguration */ -// Edited by Plaid, line 9. any to unknown export interface TransferDebitUsageConfiguration { /** * @@ -39735,10 +37443,7 @@ export interface TransferDebitUsageConfiguration { * @export * @interface TransferDevice */ -// Edited by Plaid, line 9. any to unknown export interface TransferDevice { - [key: string]: object | unknown; - /** * The IP address of the device being used to initiate the authorization. * @type {string} @@ -39757,7 +37462,6 @@ export interface TransferDevice { * @export * @interface TransferDiligenceDocumentUploadRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferDiligenceDocumentUploadRequest { /** * The Client ID of the originator whose document that you want to upload. @@ -39783,10 +37487,7 @@ export interface TransferDiligenceDocumentUploadRequest { * @export * @interface TransferDiligenceDocumentUploadResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferDiligenceDocumentUploadResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39812,7 +37513,6 @@ export enum TransferDiligenceStatus { * @export * @interface TransferDiligenceSubmitRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferDiligenceSubmitRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -39844,10 +37544,7 @@ export interface TransferDiligenceSubmitRequest { * @export * @interface TransferDiligenceSubmitResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferDiligenceSubmitResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39869,10 +37566,7 @@ export enum TransferDocumentPurpose { * @export * @interface TransferEvent */ -// Edited by Plaid, line 9. any to unknown export interface TransferEvent { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers. * @type {number} @@ -39964,7 +37658,6 @@ export interface TransferEvent { * @export * @interface TransferEventListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferEventListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40057,10 +37750,7 @@ export interface TransferEventListRequest { * @export * @interface TransferEventListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferEventListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -40090,7 +37780,6 @@ export enum TransferEventListTransferType { * @export * @interface TransferEventSyncRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferEventSyncRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40122,10 +37811,7 @@ export interface TransferEventSyncRequest { * @export * @interface TransferEventSyncResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferEventSyncResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -40166,10 +37852,7 @@ export enum TransferEventType { * @export * @interface TransferEventsUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface TransferEventsUpdateWebhook { - [key: string]: object | unknown; - /** * `TRANSFER` * @type {string} @@ -40194,10 +37877,7 @@ export interface TransferEventsUpdateWebhook { * @export * @interface TransferExpectedSweepSettlementScheduleItem */ -// Edited by Plaid, line 9. any to unknown export interface TransferExpectedSweepSettlementScheduleItem { - [key: string]: object | unknown; - /** * The settlement date of a sweep for this transfer. * @type {string} @@ -40216,10 +37896,7 @@ export interface TransferExpectedSweepSettlementScheduleItem { * @export * @interface TransferFailure */ -// Edited by Plaid, line 9. any to unknown export interface TransferFailure { - [key: string]: object | unknown; - /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the transfer status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). * @type {string} @@ -40238,7 +37915,6 @@ export interface TransferFailure { * @export * @interface TransferFundingAccount */ -// Edited by Plaid, line 9. any to unknown export interface TransferFundingAccount { /** * The access token associated with the Item data is being requested for. @@ -40258,7 +37934,6 @@ export interface TransferFundingAccount { * @export * @interface TransferGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40291,10 +37966,7 @@ export interface TransferGetRequest { * @export * @interface TransferGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferGetResponse { - [key: string]: object | unknown; - /** * * @type {Transfer} @@ -40323,10 +37995,7 @@ export enum TransferIntentAuthorizationDecision { * @export * @interface TransferIntentCreate */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentCreate { - [key: string]: object | unknown; - /** * Plaid\'s unique identifier for the transfer intent object. * @type {string} @@ -40444,7 +38113,6 @@ export enum TransferIntentCreateNetwork { * @export * @interface TransferIntentCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40537,10 +38205,7 @@ export interface TransferIntentCreateRequest { * @export * @interface TransferIntentCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentCreateResponse { - [key: string]: object | unknown; - /** * * @type {TransferIntentCreate} @@ -40559,10 +38224,7 @@ export interface TransferIntentCreateResponse { * @export * @interface TransferIntentGet */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentGet { - [key: string]: object | unknown; - /** * Plaid\'s unique identifier for a transfer intent object. * @type {string} @@ -40696,10 +38358,7 @@ export interface TransferIntentGet { * @export * @interface TransferIntentGetFailureReason */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentGetFailureReason { - [key: string]: object | unknown; - /** * A broad categorization of the error. * @type {string} @@ -40724,10 +38383,7 @@ export interface TransferIntentGetFailureReason { * @export * @interface TransferIntentGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentGetRequest { - [key: string]: object | unknown; - /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. * @type {string} @@ -40752,10 +38408,7 @@ export interface TransferIntentGetRequest { * @export * @interface TransferIntentGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferIntentGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferIntentGet} @@ -40785,10 +38438,7 @@ export enum TransferIntentStatus { * @export * @interface TransferLedgerBalance */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerBalance { - [key: string]: object | unknown; - /** * The amount of this balance available for use (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} @@ -40807,7 +38457,6 @@ export interface TransferLedgerBalance { * @export * @interface TransferLedgerDepositRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerDepositRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40863,10 +38512,7 @@ export interface TransferLedgerDepositRequest { * @export * @interface TransferLedgerDepositResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerDepositResponse { - [key: string]: object | unknown; - /** * * @type {TransferSweep} @@ -40885,7 +38531,6 @@ export interface TransferLedgerDepositResponse { * @export * @interface TransferLedgerDistributeRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerDistributeRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40935,10 +38580,7 @@ export interface TransferLedgerDistributeRequest { * @export * @interface TransferLedgerDistributeResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerDistributeResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -40951,7 +38593,6 @@ export interface TransferLedgerDistributeResponse { * @export * @interface TransferLedgerGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -40977,10 +38618,7 @@ export interface TransferLedgerGetRequest { * @export * @interface TransferLedgerGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferLedgerBalance} @@ -41011,7 +38649,6 @@ export enum TransferLedgerSweepSimulateEventType { * @export * @interface TransferLedgerWithdrawRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerWithdrawRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41067,10 +38704,7 @@ export interface TransferLedgerWithdrawRequest { * @export * @interface TransferLedgerWithdrawResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferLedgerWithdrawResponse { - [key: string]: object | unknown; - /** * * @type {TransferSweep} @@ -41089,7 +38723,6 @@ export interface TransferLedgerWithdrawResponse { * @export * @interface TransferListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41152,10 +38785,7 @@ export interface TransferListRequest { * @export * @interface TransferListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -41174,7 +38804,6 @@ export interface TransferListResponse { * @export * @interface TransferMetricsGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferMetricsGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41200,10 +38829,7 @@ export interface TransferMetricsGetRequest { * @export * @interface TransferMetricsGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferMetricsGetResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -41253,7 +38879,6 @@ export interface TransferMetricsGetResponse { * @export * @interface TransferMigrateAccountRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferMigrateAccountRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41297,10 +38922,7 @@ export interface TransferMigrateAccountRequest { * @export * @interface TransferMigrateAccountResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferMigrateAccountResponse { - [key: string]: object | unknown; - /** * The Plaid `access_token` for the newly created Item. * @type {string} @@ -41336,7 +38958,6 @@ export enum TransferNetwork { * @export * @interface TransferOriginatorAddress */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorAddress { /** * The full city name. @@ -41374,7 +38995,6 @@ export interface TransferOriginatorAddress { * @export * @interface TransferOriginatorCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41400,10 +39020,7 @@ export interface TransferOriginatorCreateRequest { * @export * @interface TransferOriginatorCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorCreateResponse { - [key: string]: object | unknown; - /** * Client ID of the originator. This identifier will be used when creating transfers and should be stored associated with end user information. * @type {string} @@ -41428,7 +39045,6 @@ export interface TransferOriginatorCreateResponse { * @export * @interface TransferOriginatorDiligence */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorDiligence { /** * The business name of the originator. @@ -41484,7 +39100,6 @@ export interface TransferOriginatorDiligence { * @export * @interface TransferOriginatorFundingAccountUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorFundingAccountUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41516,10 +39131,7 @@ export interface TransferOriginatorFundingAccountUpdateRequest { * @export * @interface TransferOriginatorFundingAccountUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorFundingAccountUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -41532,7 +39144,6 @@ export interface TransferOriginatorFundingAccountUpdateResponse { * @export * @interface TransferOriginatorGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41558,10 +39169,7 @@ export interface TransferOriginatorGetRequest { * @export * @interface TransferOriginatorGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorGetResponse { - [key: string]: object | unknown; - /** * * @type {DetailedOriginator} @@ -41580,7 +39188,6 @@ export interface TransferOriginatorGetResponse { * @export * @interface TransferOriginatorListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41612,10 +39219,7 @@ export interface TransferOriginatorListRequest { * @export * @interface TransferOriginatorListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferOriginatorListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -41634,7 +39238,6 @@ export interface TransferOriginatorListResponse { * @export * @interface TransferQuestionnaireCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferQuestionnaireCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41666,10 +39269,7 @@ export interface TransferQuestionnaireCreateRequest { * @export * @interface TransferQuestionnaireCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferQuestionnaireCreateResponse { - [key: string]: object | unknown; - /** * Plaid-hosted onboarding URL that you will redirect the end customer to. * @type {string} @@ -41688,7 +39288,6 @@ export interface TransferQuestionnaireCreateResponse { * @export * @interface TransferRecurringCancelRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringCancelRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41714,10 +39313,7 @@ export interface TransferRecurringCancelRequest { * @export * @interface TransferRecurringCancelResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringCancelResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -41730,7 +39326,6 @@ export interface TransferRecurringCancelResponse { * @export * @interface TransferRecurringCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41842,10 +39437,7 @@ export interface TransferRecurringCreateRequest { * @export * @interface TransferRecurringCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringCreateResponse { - [key: string]: object | unknown; - /** * * @type {RecurringTransferNullable} @@ -41876,7 +39468,6 @@ export interface TransferRecurringCreateResponse { * @export * @interface TransferRecurringGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41902,10 +39493,7 @@ export interface TransferRecurringGetRequest { * @export * @interface TransferRecurringGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringGetResponse { - [key: string]: object | unknown; - /** * * @type {RecurringTransfer} @@ -41924,7 +39512,6 @@ export interface TransferRecurringGetResponse { * @export * @interface TransferRecurringListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -41974,10 +39561,7 @@ export interface TransferRecurringListRequest { * @export * @interface TransferRecurringListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -41996,7 +39580,6 @@ export interface TransferRecurringListResponse { * @export * @interface TransferRecurringSchedule */ -// Edited by Plaid, line 9. any to unknown export interface TransferRecurringSchedule { /** * @@ -42045,10 +39628,7 @@ export enum TransferRecurringStatus { * @export * @interface TransferRefund */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefund { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a refund. * @type {string} @@ -42097,7 +39677,6 @@ export interface TransferRefund { * @export * @interface TransferRefundCancelRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundCancelRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42123,10 +39702,7 @@ export interface TransferRefundCancelRequest { * @export * @interface TransferRefundCancelResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundCancelResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -42139,7 +39715,6 @@ export interface TransferRefundCancelResponse { * @export * @interface TransferRefundCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42177,10 +39752,7 @@ export interface TransferRefundCreateRequest { * @export * @interface TransferRefundCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundCreateResponse { - [key: string]: object | unknown; - /** * * @type {TransferRefund} @@ -42199,10 +39771,7 @@ export interface TransferRefundCreateResponse { * @export * @interface TransferRefundFailure */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundFailure { - [key: string]: object | unknown; - /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). * @type {string} @@ -42221,7 +39790,6 @@ export interface TransferRefundFailure { * @export * @interface TransferRefundGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42247,10 +39815,7 @@ export interface TransferRefundGetRequest { * @export * @interface TransferRefundGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRefundGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferRefund} @@ -42283,10 +39848,7 @@ export enum TransferRefundStatus { * @export * @interface TransferRepayment */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepayment { - [key: string]: object | unknown; - /** * Identifier of the repayment. * @type {string} @@ -42317,7 +39879,6 @@ export interface TransferRepayment { * @export * @interface TransferRepaymentListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepaymentListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42361,10 +39922,7 @@ export interface TransferRepaymentListRequest { * @export * @interface TransferRepaymentListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepaymentListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -42383,10 +39941,7 @@ export interface TransferRepaymentListResponse { * @export * @interface TransferRepaymentReturn */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepaymentReturn { - [key: string]: object | unknown; - /** * The unique identifier of the guaranteed transfer that was returned. * @type {string} @@ -42417,7 +39972,6 @@ export interface TransferRepaymentReturn { * @export * @interface TransferRepaymentReturnListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepaymentReturnListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42455,10 +40009,7 @@ export interface TransferRepaymentReturnListRequest { * @export * @interface TransferRepaymentReturnListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferRepaymentReturnListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -42501,10 +40052,7 @@ export enum TransferStatus { * @export * @interface TransferSweep */ -// Edited by Plaid, line 9. any to unknown export interface TransferSweep { - [key: string]: object | unknown; - /** * Identifier of the sweep. * @type {string} @@ -42571,7 +40119,6 @@ export interface TransferSweep { * @export * @interface TransferSweepGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferSweepGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42597,10 +40144,7 @@ export interface TransferSweepGetRequest { * @export * @interface TransferSweepGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferSweepGetResponse { - [key: string]: object | unknown; - /** * * @type {TransferSweep} @@ -42619,7 +40163,6 @@ export interface TransferSweepGetResponse { * @export * @interface TransferSweepListRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferSweepListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -42699,10 +40242,7 @@ export interface TransferSweepListRequest { * @export * @interface TransferSweepListResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferSweepListResponse { - [key: string]: object | unknown; - /** * * @type {Array} @@ -42734,10 +40274,7 @@ export enum TransferSweepStatus { * @export * @interface TransferTestClock */ -// Edited by Plaid, line 9. any to unknown export interface TransferTestClock { - [key: string]: object | unknown; - /** * Plaid’s unique identifier for a test clock. * @type {string} @@ -42766,7 +40303,6 @@ export enum TransferType { * @export * @interface TransferUserAddressInRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferUserAddressInRequest { /** * The street number and name (i.e., \"100 Market St.\"). @@ -42804,10 +40340,7 @@ export interface TransferUserAddressInRequest { * @export * @interface TransferUserAddressInResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferUserAddressInResponse { - [key: string]: object | unknown; - /** * The street number and name (i.e., \"100 Market St.\"). * @type {string} @@ -42844,7 +40377,6 @@ export interface TransferUserAddressInResponse { * @export * @interface TransferUserInRequest */ -// Edited by Plaid, line 9. any to unknown export interface TransferUserInRequest { /** * The user\'s legal name. @@ -42876,7 +40408,6 @@ export interface TransferUserInRequest { * @export * @interface TransferUserInRequestDeprecated */ -// Edited by Plaid, line 9. any to unknown export interface TransferUserInRequestDeprecated { /** * The user\'s legal name. @@ -42908,10 +40439,7 @@ export interface TransferUserInRequestDeprecated { * @export * @interface TransferUserInResponse */ -// Edited by Plaid, line 9. any to unknown export interface TransferUserInResponse { - [key: string]: object | unknown; - /** * The user\'s legal name. * @type {string} @@ -42942,7 +40470,6 @@ export interface TransferUserInResponse { * @export * @interface UpdateEntityScreeningRequestSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface UpdateEntityScreeningRequestSearchTerms { /** * ID of the associated entity program. @@ -42992,7 +40519,6 @@ export interface UpdateEntityScreeningRequestSearchTerms { * @export * @interface UpdateIndividualScreeningRequestSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface UpdateIndividualScreeningRequestSearchTerms { /** * ID of the associated program. @@ -43030,10 +40556,7 @@ export interface UpdateIndividualScreeningRequestSearchTerms { * @export * @interface UserAccountRevokedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface UserAccountRevokedWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -43076,10 +40599,7 @@ export interface UserAccountRevokedWebhook { * @export * @interface UserAddress */ -// Edited by Plaid, line 9. any to unknown export interface UserAddress { - [key: string]: object | unknown; - /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -43122,7 +40642,6 @@ export interface UserAddress { * @export * @interface UserCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface UserCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -43154,10 +40673,7 @@ export interface UserCreateRequest { * @export * @interface UserCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface UserCreateResponse { - [key: string]: object | unknown; - /** * The user token associated with the User data is being requested for. * @type {string} @@ -43182,10 +40698,7 @@ export interface UserCreateResponse { * @export * @interface UserCustomPassword */ -// Edited by Plaid, line 9. any to unknown export interface UserCustomPassword { - [key: string]: object | unknown; - /** * The version of the password schema to use, possible values are 1 or 2. The default value is 2. You should only specify 1 if you know it is necessary for your test suite. * @type {string} @@ -43228,10 +40741,7 @@ export interface UserCustomPassword { * @export * @interface UserDataOverview */ -// Edited by Plaid, line 9. any to unknown export interface UserDataOverview { - [key: string]: object | unknown; - /** * The total number of transactions. * @type {number} @@ -43274,10 +40784,7 @@ export interface UserDataOverview { * @export * @interface UserIDNumber */ -// Edited by Plaid, line 9. any to unknown export interface UserIDNumber { - [key: string]: object | unknown; - /** * Value of identity document value typed in by user. Alpha-numeric, with all formatting characters stripped. * @type {string} @@ -43296,10 +40803,7 @@ export interface UserIDNumber { * @export * @interface UserPermissionRevokedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface UserPermissionRevokedWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -43379,7 +40883,6 @@ export enum UserStatedIncomeSourcePayType { * @export * @interface UserUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface UserUpdateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -43411,10 +40914,7 @@ export interface UserUpdateRequest { * @export * @interface UserUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface UserUpdateResponse { - [key: string]: object | unknown; - /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -43427,10 +40927,7 @@ export interface UserUpdateResponse { * @export * @interface ValidationSource */ -// Edited by Plaid, line 9. any to unknown export interface ValidationSource { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -43449,10 +40946,7 @@ export interface ValidationSource { * @export * @interface ValidationSources */ -// Edited by Plaid, line 9. any to unknown export interface ValidationSources { - [key: string]: object | unknown; - /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -43465,10 +40959,7 @@ export interface ValidationSources { * @export * @interface VerificationExpiredWebhook */ -// Edited by Plaid, line 9. any to unknown export interface VerificationExpiredWebhook { - [key: string]: object | unknown; - /** * `AUTH` * @type {string} @@ -43511,10 +41002,7 @@ export interface VerificationExpiredWebhook { * @export * @interface VerificationOfAsset */ -// Edited by Plaid, line 9. any to unknown export interface VerificationOfAsset { - [key: string]: object | unknown; - /** * * @type {ReportingInformation} @@ -43539,10 +41027,7 @@ export interface VerificationOfAsset { * @export * @interface VerificationOfAssetResponse */ -// Edited by Plaid, line 9. any to unknown export interface VerificationOfAssetResponse { - [key: string]: object | unknown; - /** * * @type {Assets} @@ -43579,10 +41064,7 @@ export enum VerificationStatus { * @export * @interface W2 */ -// Edited by Plaid, line 9. any to unknown export interface W2 { - [key: string]: object | unknown; - /** * * @type {PaystubEmployer} @@ -43715,10 +41197,7 @@ export interface W2 { * @export * @interface W2Box12 */ -// Edited by Plaid, line 9. any to unknown export interface W2Box12 { - [key: string]: object | unknown; - /** * W2 Box 12 code. * @type {string} @@ -43737,10 +41216,7 @@ export interface W2Box12 { * @export * @interface W2StateAndLocalWages */ -// Edited by Plaid, line 9. any to unknown export interface W2StateAndLocalWages { - [key: string]: object | unknown; - /** * State associated with the wage. * @type {string} @@ -43789,10 +41265,7 @@ export interface W2StateAndLocalWages { * @export * @interface Wallet */ -// Edited by Plaid, line 9. any to unknown export interface Wallet { - [key: string]: object | unknown; - /** * A unique ID identifying the e-wallet * @type {string} @@ -43829,10 +41302,7 @@ export interface Wallet { * @export * @interface WalletBalance */ -// Edited by Plaid, line 9. any to unknown export interface WalletBalance { - [key: string]: object | unknown; - /** * The ISO-4217 currency code of the balance * @type {string} @@ -43857,7 +41327,6 @@ export interface WalletBalance { * @export * @interface WalletCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletCreateRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -43883,7 +41352,6 @@ export interface WalletCreateRequest { * @export * @interface WalletCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletCreateResponse { /** * A unique ID identifying the e-wallet @@ -43927,7 +41395,6 @@ export interface WalletCreateResponse { * @export * @interface WalletGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -43953,7 +41420,6 @@ export interface WalletGetRequest { * @export * @interface WalletGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletGetResponse { /** * A unique ID identifying the e-wallet @@ -44007,7 +41473,6 @@ export enum WalletISOCurrencyCode { * @export * @interface WalletListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -44045,10 +41510,7 @@ export interface WalletListRequest { * @export * @interface WalletListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletListResponse { - [key: string]: object | unknown; - /** * An array of e-wallets * @type {Array} @@ -44073,10 +41535,7 @@ export interface WalletListResponse { * @export * @interface WalletNumbers */ -// Edited by Plaid, line 9. any to unknown export interface WalletNumbers { - [key: string]: object | unknown; - /** * * @type {RecipientBACS} @@ -44118,10 +41577,7 @@ export enum WalletStatus { * @export * @interface WalletTransaction */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransaction { - [key: string]: object | unknown; - /** * A unique ID identifying the transaction * @type {string} @@ -44214,10 +41670,7 @@ export enum WalletTransactionTypeEnum { * @export * @interface WalletTransactionAmount */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionAmount { - [key: string]: object | unknown; - /** * * @type {WalletISOCurrencyCode} @@ -44236,10 +41689,7 @@ export interface WalletTransactionAmount { * @export * @interface WalletTransactionCounterparty */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionCounterparty { - [key: string]: object | unknown; - /** * The name of the counterparty * @type {string} @@ -44270,7 +41720,6 @@ export interface WalletTransactionCounterparty { * @export * @interface WalletTransactionCounterpartyBACS */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionCounterpartyBACS { /** * The account number of the account. Maximum of 10 characters. @@ -44290,10 +41739,7 @@ export interface WalletTransactionCounterpartyBACS { * @export * @interface WalletTransactionCounterpartyInternational */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionCounterpartyInternational { - [key: string]: object | unknown; - /** * International Bank Account Number (IBAN). * @type {string} @@ -44306,10 +41752,7 @@ export interface WalletTransactionCounterpartyInternational { * @export * @interface WalletTransactionCounterpartyNumbers */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionCounterpartyNumbers { - [key: string]: object | unknown; - /** * * @type {WalletTransactionCounterpartyBACS} @@ -44328,7 +41771,6 @@ export interface WalletTransactionCounterpartyNumbers { * @export * @interface WalletTransactionExecuteRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionExecuteRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -44378,10 +41820,7 @@ export interface WalletTransactionExecuteRequest { * @export * @interface WalletTransactionExecuteResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionExecuteResponse { - [key: string]: object | unknown; - /** * A unique ID identifying the transaction * @type {string} @@ -44419,7 +41858,6 @@ export enum WalletTransactionFailureReason { * @export * @interface WalletTransactionGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -44445,7 +41883,6 @@ export interface WalletTransactionGetRequest { * @export * @interface WalletTransactionGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionGetResponse { /** * A unique ID identifying the transaction @@ -44545,7 +41982,6 @@ export enum WalletTransactionGetResponseTypeEnum { * @export * @interface WalletTransactionListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -44589,7 +42025,6 @@ export interface WalletTransactionListRequest { * @export * @interface WalletTransactionListRequestOptions */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionListRequestOptions { /** * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DDThh:mm:ssZ) for filtering transactions, inclusive of the provided date. @@ -44609,10 +42044,7 @@ export interface WalletTransactionListRequestOptions { * @export * @interface WalletTransactionListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionListResponse { - [key: string]: object | unknown; - /** * An array of transactions of an e-wallet, associated with the given `wallet_id` * @type {Array} @@ -44651,10 +42083,7 @@ export enum WalletTransactionStatus { * @export * @interface WalletTransactionStatusUpdateWebhook */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionStatusUpdateWebhook { - [key: string]: object | unknown; - /** * `WALLET` * @type {string} @@ -44715,7 +42144,6 @@ export interface WalletTransactionStatusUpdateWebhook { * @export * @interface WalletTransactionsListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WalletTransactionsListRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -44759,10 +42187,7 @@ export interface WalletTransactionsListRequest { * @export * @interface Warning */ -// Edited by Plaid, line 9. any to unknown export interface Warning { - [key: string]: object | unknown; - /** * The warning type, which will always be `ASSET_REPORT_WARNING` * @type {string} @@ -44798,10 +42223,7 @@ export enum WarningWarningCodeEnum { * @export * @interface WatchlistScreeningAuditTrail */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningAuditTrail { - [key: string]: object | unknown; - /** * * @type {Source} @@ -44826,10 +42248,7 @@ export interface WatchlistScreeningAuditTrail { * @export * @interface WatchlistScreeningDocument */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningDocument { - [key: string]: object | unknown; - /** * * @type {WatchlistScreeningDocumentType} @@ -44869,7 +42288,6 @@ export enum WatchlistScreeningDocumentType { * @export * @interface WatchlistScreeningEntityCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityCreateRequest { /** * @@ -44901,10 +42319,7 @@ export interface WatchlistScreeningEntityCreateRequest { * @export * @interface WatchlistScreeningEntityCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated entity screening. * @type {string} @@ -44953,7 +42368,6 @@ export interface WatchlistScreeningEntityCreateResponse { * @export * @interface WatchlistScreeningEntityGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityGetRequest { /** * ID of the associated entity screening. @@ -44979,10 +42393,7 @@ export interface WatchlistScreeningEntityGetRequest { * @export * @interface WatchlistScreeningEntityGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityGetResponse { - [key: string]: object | unknown; - /** * ID of the associated entity screening. * @type {string} @@ -45031,7 +42442,6 @@ export interface WatchlistScreeningEntityGetResponse { * @export * @interface WatchlistScreeningEntityHistoryListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityHistoryListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45063,10 +42473,7 @@ export interface WatchlistScreeningEntityHistoryListRequest { * @export * @interface WatchlistScreeningEntityHistoryListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityHistoryListResponse { - [key: string]: object | unknown; - /** * List of entity watchlist screening * @type {Array} @@ -45091,7 +42498,6 @@ export interface WatchlistScreeningEntityHistoryListResponse { * @export * @interface WatchlistScreeningEntityHitListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityHitListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45123,10 +42529,7 @@ export interface WatchlistScreeningEntityHitListRequest { * @export * @interface WatchlistScreeningEntityHitListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityHitListResponse { - [key: string]: object | unknown; - /** * List of entity watchlist screening hits * @type {Array} @@ -45151,7 +42554,6 @@ export interface WatchlistScreeningEntityHitListResponse { * @export * @interface WatchlistScreeningEntityListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45201,10 +42603,7 @@ export interface WatchlistScreeningEntityListRequest { * @export * @interface WatchlistScreeningEntityListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityListResponse { - [key: string]: object | unknown; - /** * List of entity watchlist screening * @type {Array} @@ -45229,7 +42628,6 @@ export interface WatchlistScreeningEntityListResponse { * @export * @interface WatchlistScreeningEntityProgramGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityProgramGetRequest { /** * ID of the associated entity program. @@ -45255,10 +42653,7 @@ export interface WatchlistScreeningEntityProgramGetRequest { * @export * @interface WatchlistScreeningEntityProgramGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityProgramGetResponse { - [key: string]: object | unknown; - /** * ID of the associated entity program. * @type {string} @@ -45319,7 +42714,6 @@ export interface WatchlistScreeningEntityProgramGetResponse { * @export * @interface WatchlistScreeningEntityProgramListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityProgramListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45345,10 +42739,7 @@ export interface WatchlistScreeningEntityProgramListRequest { * @export * @interface WatchlistScreeningEntityProgramListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityProgramListResponse { - [key: string]: object | unknown; - /** * List of entity watchlist screening programs * @type {Array} @@ -45373,7 +42764,6 @@ export interface WatchlistScreeningEntityProgramListResponse { * @export * @interface WatchlistScreeningEntityReviewCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityReviewCreateRequest { /** * Hits to mark as a true positive after thorough manual review. These hits will never recur or be updated once dismissed. In most cases, confirmed hits indicate that the customer should be rejected. @@ -45417,10 +42807,7 @@ export interface WatchlistScreeningEntityReviewCreateRequest { * @export * @interface WatchlistScreeningEntityReviewCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityReviewCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated entity review. * @type {string} @@ -45463,7 +42850,6 @@ export interface WatchlistScreeningEntityReviewCreateResponse { * @export * @interface WatchlistScreeningEntityReviewListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityReviewListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45495,10 +42881,7 @@ export interface WatchlistScreeningEntityReviewListRequest { * @export * @interface WatchlistScreeningEntityReviewListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityReviewListResponse { - [key: string]: object | unknown; - /** * List of entity watchlist screening reviews * @type {Array} @@ -45523,7 +42906,6 @@ export interface WatchlistScreeningEntityReviewListResponse { * @export * @interface WatchlistScreeningEntityUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityUpdateRequest { /** * ID of the associated entity screening. @@ -45588,10 +42970,7 @@ export enum WatchlistScreeningEntityUpdateRequestResettableField { * @export * @interface WatchlistScreeningEntityUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningEntityUpdateResponse { - [key: string]: object | unknown; - /** * ID of the associated entity screening. * @type {string} @@ -45640,10 +43019,7 @@ export interface WatchlistScreeningEntityUpdateResponse { * @export * @interface WatchlistScreeningHit */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningHit { - [key: string]: object | unknown; - /** * ID of the associated screening hit. * @type {string} @@ -45710,10 +43086,7 @@ export interface WatchlistScreeningHit { * @export * @interface WatchlistScreeningHitLocations */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningHitLocations { - [key: string]: object | unknown; - /** * The full location string, potentially including elements like street, city, postal codes and country codes. Note that this is not necessarily a complete or well-formatted address. * @type {string} @@ -45743,10 +43116,7 @@ export enum WatchlistScreeningHitStatus { * @export * @interface WatchlistScreeningIndividual */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividual { - [key: string]: object | unknown; - /** * ID of the associated screening. * @type {string} @@ -45789,7 +43159,6 @@ export interface WatchlistScreeningIndividual { * @export * @interface WatchlistScreeningIndividualCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualCreateRequest { /** * @@ -45821,10 +43190,7 @@ export interface WatchlistScreeningIndividualCreateRequest { * @export * @interface WatchlistScreeningIndividualCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated screening. * @type {string} @@ -45873,7 +43239,6 @@ export interface WatchlistScreeningIndividualCreateResponse { * @export * @interface WatchlistScreeningIndividualGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualGetRequest { /** * ID of the associated screening. @@ -45899,10 +43264,7 @@ export interface WatchlistScreeningIndividualGetRequest { * @export * @interface WatchlistScreeningIndividualGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualGetResponse { - [key: string]: object | unknown; - /** * ID of the associated screening. * @type {string} @@ -45951,7 +43313,6 @@ export interface WatchlistScreeningIndividualGetResponse { * @export * @interface WatchlistScreeningIndividualHistoryListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualHistoryListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -45983,10 +43344,7 @@ export interface WatchlistScreeningIndividualHistoryListRequest { * @export * @interface WatchlistScreeningIndividualHistoryListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualHistoryListResponse { - [key: string]: object | unknown; - /** * List of individual watchlist screenings * @type {Array} @@ -46011,7 +43369,6 @@ export interface WatchlistScreeningIndividualHistoryListResponse { * @export * @interface WatchlistScreeningIndividualHitListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualHitListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -46043,10 +43400,7 @@ export interface WatchlistScreeningIndividualHitListRequest { * @export * @interface WatchlistScreeningIndividualHitListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualHitListResponse { - [key: string]: object | unknown; - /** * List of individual watchlist screening hits * @type {Array} @@ -46071,7 +43425,6 @@ export interface WatchlistScreeningIndividualHitListResponse { * @export * @interface WatchlistScreeningIndividualListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -46121,10 +43474,7 @@ export interface WatchlistScreeningIndividualListRequest { * @export * @interface WatchlistScreeningIndividualListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualListResponse { - [key: string]: object | unknown; - /** * List of individual watchlist screenings * @type {Array} @@ -46149,7 +43499,6 @@ export interface WatchlistScreeningIndividualListResponse { * @export * @interface WatchlistScreeningIndividualProgramGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualProgramGetRequest { /** * ID of the associated program. @@ -46175,10 +43524,7 @@ export interface WatchlistScreeningIndividualProgramGetRequest { * @export * @interface WatchlistScreeningIndividualProgramGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualProgramGetResponse { - [key: string]: object | unknown; - /** * ID of the associated program. * @type {string} @@ -46239,7 +43585,6 @@ export interface WatchlistScreeningIndividualProgramGetResponse { * @export * @interface WatchlistScreeningIndividualProgramListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualProgramListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -46265,10 +43610,7 @@ export interface WatchlistScreeningIndividualProgramListRequest { * @export * @interface WatchlistScreeningIndividualProgramListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualProgramListResponse { - [key: string]: object | unknown; - /** * List of individual watchlist screening programs * @type {Array} @@ -46293,7 +43635,6 @@ export interface WatchlistScreeningIndividualProgramListResponse { * @export * @interface WatchlistScreeningIndividualReviewCreateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualReviewCreateRequest { /** * Hits to mark as a true positive after thorough manual review. These hits will never recur or be updated once dismissed. In most cases, confirmed hits indicate that the customer should be rejected. @@ -46337,10 +43678,7 @@ export interface WatchlistScreeningIndividualReviewCreateRequest { * @export * @interface WatchlistScreeningIndividualReviewCreateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualReviewCreateResponse { - [key: string]: object | unknown; - /** * ID of the associated review. * @type {string} @@ -46383,7 +43721,6 @@ export interface WatchlistScreeningIndividualReviewCreateResponse { * @export * @interface WatchlistScreeningIndividualReviewListRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualReviewListRequest { /** * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. @@ -46415,10 +43752,7 @@ export interface WatchlistScreeningIndividualReviewListRequest { * @export * @interface WatchlistScreeningIndividualReviewListResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualReviewListResponse { - [key: string]: object | unknown; - /** * List of screening reviews * @type {Array} @@ -46443,7 +43777,6 @@ export interface WatchlistScreeningIndividualReviewListResponse { * @export * @interface WatchlistScreeningIndividualUpdateRequest */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualUpdateRequest { /** * ID of the associated screening. @@ -46508,10 +43841,7 @@ export enum WatchlistScreeningIndividualUpdateRequestResettableField { * @export * @interface WatchlistScreeningIndividualUpdateResponse */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningIndividualUpdateResponse { - [key: string]: object | unknown; - /** * ID of the associated screening. * @type {string} @@ -46560,7 +43890,6 @@ export interface WatchlistScreeningIndividualUpdateResponse { * @export * @interface WatchlistScreeningRequestSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningRequestSearchTerms { /** * ID of the associated program. @@ -46598,10 +43927,7 @@ export interface WatchlistScreeningRequestSearchTerms { * @export * @interface WatchlistScreeningReview */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningReview { - [key: string]: object | unknown; - /** * ID of the associated review. * @type {string} @@ -46638,10 +43964,7 @@ export interface WatchlistScreeningReview { * @export * @interface WatchlistScreeningSearchTerms */ -// Edited by Plaid, line 9. any to unknown export interface WatchlistScreeningSearchTerms { - [key: string]: object | unknown; - /** * ID of the associated program. * @type {string} @@ -46732,10 +44055,7 @@ export enum WebhookType { * @export * @interface WebhookUpdateAcknowledgedWebhook */ -// Edited by Plaid, line 9. any to unknown export interface WebhookUpdateAcknowledgedWebhook { - [key: string]: object | unknown; - /** * `ITEM` * @type {string} @@ -46778,7 +44098,6 @@ export interface WebhookUpdateAcknowledgedWebhook { * @export * @interface WebhookVerificationKeyGetRequest */ -// Edited by Plaid, line 9. any to unknown export interface WebhookVerificationKeyGetRequest { /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. @@ -46804,10 +44123,7 @@ export interface WebhookVerificationKeyGetRequest { * @export * @interface WebhookVerificationKeyGetResponse */ -// Edited by Plaid, line 9. any to unknown export interface WebhookVerificationKeyGetResponse { - [key: string]: object | unknown; - /** * * @type {JWKPublicKey} @@ -46826,7 +44142,6 @@ export interface WebhookVerificationKeyGetResponse { * @export * @interface YTDGrossIncomeSummaryFieldNumber */ -// Edited by Plaid, line 9. any to unknown export interface YTDGrossIncomeSummaryFieldNumber { /** * The value of the field. @@ -46846,7 +44161,6 @@ export interface YTDGrossIncomeSummaryFieldNumber { * @export * @interface YTDNetIncomeSummaryFieldNumber */ -// Edited by Plaid, line 9. any to unknown export interface YTDNetIncomeSummaryFieldNumber { /** * The value of the field. diff --git a/base.ts b/base.ts index ea61e716..47f3ecde 100644 --- a/base.ts +++ b/base.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/common.ts b/common.ts index 852f9e21..05615da4 100644 --- a/common.ts +++ b/common.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/configuration.ts b/configuration.ts index ad6ebcc8..3c35db6c 100644 --- a/configuration.ts +++ b/configuration.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -97,7 +97,7 @@ export class Configuration { if(!this.baseOptions) this.baseOptions = {}; if(!this.baseOptions.headers) this.baseOptions.headers = {}; this.baseOptions.headers = { - ['User-Agent']: `Plaid Node v18.3.0`, + ['User-Agent']: `Plaid Node v19.0.0`, ['Plaid-Version']: '2020-09-14', ...this.baseOptions.headers, } diff --git a/dist/api.d.ts b/dist/api.d.ts index 68fe73b3..564d3577 100644 --- a/dist/api.d.ts +++ b/dist/api.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -29,7 +29,6 @@ export declare enum ACHClass { * @interface APR */ export interface APR { - [key: string]: object | unknown; /** * Annual Percentage Rate applied. * @type {number} @@ -249,7 +248,6 @@ export interface AccountAssetsAllOf { * @interface AccountBalance */ export interface AccountBalance { - [key: string]: object | unknown; /** * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts (or `brokerage`-type accounts for API versions 2018-05-22 and earlier), the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. If `current` is `null` this field is guaranteed not to be `null`. * @type {number} @@ -293,7 +291,6 @@ export interface AccountBalance { * @interface AccountBase */ export interface AccountBase { - [key: string]: object | unknown; /** * Plaid’s unique identifier for the account. This value will not change unless Plaid can\'t reconcile the account with the data returned by the financial institution. This may occur, for example, when the name of the account changes. If this happens a new `account_id` will be assigned to the account. The `account_id` can also change if the `access_token` is deleted and the same credentials that were used to generate that `access_token` are used to generate a new `access_token` on a later date. In that case, the new `account_id` will be different from the old `account_id`. If an account with a specific `account_id` disappears instead of changing, the account is likely closed. Closed accounts are not returned by the Plaid API. Like all Plaid identifiers, the `account_id` is case sensitive. * @type {string} @@ -399,7 +396,6 @@ export interface AccountFilter { * @interface AccountFiltersResponse */ export interface AccountFiltersResponse { - [key: string]: object | unknown; /** * * @type {DepositoryFilter} @@ -875,7 +871,6 @@ export interface AccountsBalanceGetRequestOptions { * @interface AccountsBalanceGetRequestPaymentDetails */ export interface AccountsBalanceGetRequestPaymentDetails { - [key: string]: object | unknown; /** * The Plaid `account_id` of the account that is the funding source for the proposed transaction. The `account_id` is returned in the `/accounts/get` endpoint as well as the [`onSuccess`](/docs/link/ios/#link-ios-onsuccess-linkSuccess-metadata-accounts-id) callback metadata. This will return an [`INVALID_ACCOUNT_ID`](/docs/errors/invalid-input/#invalid_account_id) error if the account has been removed at the bank or if the `account_id` is no longer valid. * @type {string} @@ -907,7 +902,6 @@ export interface AccountsBalanceGetRequestPaymentDetails { * @interface AccountsBalanceGetResponsePaymentRiskAssessment */ export interface AccountsBalanceGetResponsePaymentRiskAssessment { - [key: string]: object | unknown; /** * A five-tier risk assessment for the transaction based on the probability of return. * @type {string} @@ -971,7 +965,6 @@ export interface AccountsGetRequestOptions { * @interface AccountsGetResponse */ export interface AccountsGetResponse { - [key: string]: object | unknown; /** * An array of financial institution accounts associated with the Item. If `/accounts/balance/get` was called, each account will include real-time balance information. * @type {Array} @@ -1081,7 +1074,6 @@ export declare enum ActivityType { * @interface Address */ export interface Address { - [key: string]: object | unknown; /** * * @type {AddressData} @@ -1101,7 +1093,6 @@ export interface Address { * @interface AddressData */ export interface AddressData { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -1139,7 +1130,6 @@ export interface AddressData { * @interface AddressDataNotRequired */ export interface AddressDataNotRequired { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -1251,7 +1241,6 @@ export interface AddressDataNullableNoRequiredFields { * @interface AddressMatchScore */ export interface AddressMatchScore { - [key: string]: object | unknown; /** * Match score for address. 100 is a perfect match, 99-90 is a strong match, 89-70 is a partial match, anything below 70 is considered a weak match. Typically, the match threshold should be set to a score of 70 or higher. If the address is missing from either the API or financial institution, this is null. * @type {number} @@ -1410,7 +1399,6 @@ export interface ApplicationGetRequest { * @interface ApplicationGetResponse */ export interface ApplicationGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -1430,7 +1418,6 @@ export interface ApplicationGetResponse { * @interface Asset */ export interface Asset { - [key: string]: object | unknown; /** * * @type {AssetDetail} @@ -1468,7 +1455,6 @@ export interface Asset { * @interface AssetDetail */ export interface AssetDetail { - [key: string]: object | unknown; /** * A vendor created unique Identifier. * @type {string} @@ -1536,7 +1522,6 @@ export interface AssetDetail { * @interface AssetHolder */ export interface AssetHolder { - [key: string]: object | unknown; /** * * @type {AssetHolderName} @@ -1550,7 +1535,6 @@ export interface AssetHolder { * @interface AssetHolderName */ export interface AssetHolderName { - [key: string]: object | unknown; /** * The unparsed name of either an individual or a legal entity. * @type {string} @@ -1564,7 +1548,6 @@ export interface AssetHolderName { * @interface AssetOwner */ export interface AssetOwner { - [key: string]: object | unknown; /** * Account Owner Full Name. * @type {string} @@ -1578,7 +1561,6 @@ export interface AssetOwner { * @interface AssetOwners */ export interface AssetOwners { - [key: string]: object | unknown; /** * Multiple Occurances of Account Owners Full Name up to 4. * @type {Array} @@ -1592,7 +1574,6 @@ export interface AssetOwners { * @interface AssetReport */ export interface AssetReport { - [key: string]: object | unknown; /** * A unique ID identifying an Asset Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -1676,7 +1657,6 @@ export interface AssetReportAuditCopyCreateRequest { * @interface AssetReportAuditCopyCreateResponse */ export interface AssetReportAuditCopyCreateResponse { - [key: string]: object | unknown; /** * A token that can be shared with a third party auditor to allow them to obtain access to the Asset Report. This token should be stored securely. * @type {string} @@ -1746,7 +1726,6 @@ export interface AssetReportAuditCopyRemoveRequest { * @interface AssetReportAuditCopyRemoveResponse */ export interface AssetReportAuditCopyRemoveResponse { - [key: string]: object | unknown; /** * `true` if the Audit Copy was successfully removed. * @type {boolean} @@ -1848,7 +1827,6 @@ export interface AssetReportCreateRequestOptions { * @interface AssetReportCreateResponse */ export interface AssetReportCreateResponse { - [key: string]: object | unknown; /** * A token that can be provided to endpoints such as `/asset_report/get` or `/asset_report/pdf/get` to fetch or update an Asset Report. * @type {string} @@ -1905,7 +1883,6 @@ export interface AssetReportFilterRequest { * @interface AssetReportFilterResponse */ export interface AssetReportFilterResponse { - [key: string]: object | unknown; /** * A token that can be provided to endpoints such as `/asset_report/get` or `/asset_report/pdf/get` to fetch or update an Asset Report. * @type {string} @@ -1931,7 +1908,6 @@ export interface AssetReportFilterResponse { * @interface AssetReportFreddie */ export interface AssetReportFreddie { - [key: string]: object | unknown; /** * * @type {Loans} @@ -1957,7 +1933,6 @@ export interface AssetReportFreddie { * @interface AssetReportFreddieGetRequest */ export interface AssetReportFreddieGetRequest { - [key: string]: object | unknown; /** * A token that can be shared with a third party auditor to allow them to obtain access to the Asset Report. This token should be stored securely. * @type {string} @@ -1983,7 +1958,6 @@ export interface AssetReportFreddieGetRequest { * @interface AssetReportFreddieGetResponse */ export interface AssetReportFreddieGetResponse { - [key: string]: object | unknown; /** * * @type {AssetReportFreddie} @@ -2071,7 +2045,6 @@ export interface AssetReportGetRequestOptions { * @interface AssetReportGetResponse */ export interface AssetReportGetResponse { - [key: string]: object | unknown; /** * * @type {AssetReport} @@ -2097,7 +2070,6 @@ export interface AssetReportGetResponse { * @interface AssetReportInvestmentHolding */ export interface AssetReportInvestmentHolding { - [key: string]: object | unknown; /** * The Plaid `account_id` associated with the holding. * @type {string} @@ -2165,7 +2137,6 @@ export interface AssetReportInvestmentHolding { * @interface AssetReportInvestmentSecurity */ export interface AssetReportInvestmentSecurity { - [key: string]: object | unknown; /** * A unique, Plaid-specific identifier for the security, used to associate securities with holdings. Like all Plaid identifiers, the `security_id` is case sensitive. The `security_id` may change if inherent details of the security change due to a corporate action, for example, in the event of a ticker symbol change or CUSIP change. * @type {string} @@ -2197,7 +2168,6 @@ export interface AssetReportInvestmentSecurity { * @interface AssetReportInvestments */ export interface AssetReportInvestments { - [key: string]: object | unknown; /** * The ID of the Investment transaction, unique across all Plaid transactions. Like all Plaid identifiers, the `investment_transaction_id` is case sensitive. * @type {string} @@ -2283,7 +2253,6 @@ export interface AssetReportInvestments { * @interface AssetReportItem */ export interface AssetReportItem { - [key: string]: object | unknown; /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -2427,7 +2396,6 @@ export interface AssetReportRefreshRequestOptions { * @interface AssetReportRefreshResponse */ export interface AssetReportRefreshResponse { - [key: string]: object | unknown; /** * A unique ID identifying an Asset Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -2478,7 +2446,6 @@ export interface AssetReportRemoveRequest { * @interface AssetReportRemoveResponse */ export interface AssetReportRemoveResponse { - [key: string]: object | unknown; /** * `true` if the Asset Report was successfully removed. * @type {boolean} @@ -2498,7 +2465,6 @@ export interface AssetReportRemoveResponse { * @interface AssetReportTransaction */ export interface AssetReportTransaction { - [key: string]: object | unknown; /** * The ID of the account in which this transaction occurred. * @type {string} @@ -2643,7 +2609,6 @@ export declare enum AssetReportTransactionType { * @interface AssetReportUser */ export interface AssetReportUser { - [key: string]: object | unknown; /** * An identifier you determine and submit for the user. * @type {string} @@ -2693,7 +2658,6 @@ export interface AssetReportUser { * @interface AssetTransaction */ export interface AssetTransaction { - [key: string]: object | unknown; /** * * @type {AssetTransactionDetail} @@ -2827,7 +2791,6 @@ export declare enum AssetTransactionCategoryType { * @interface AssetTransactionDescription */ export interface AssetTransactionDescription { - [key: string]: object | unknown; /** * Asset Transaction Description String up to 3 occurances 1 required. * @type {string} @@ -2841,7 +2804,6 @@ export interface AssetTransactionDescription { * @interface AssetTransactionDetail */ export interface AssetTransactionDetail { - [key: string]: object | unknown; /** * A vendor created unique Identifier. * @type {string} @@ -2912,7 +2874,6 @@ export declare enum AssetTransactionType { * @interface AssetTransactions */ export interface AssetTransactions { - [key: string]: object | unknown; /** * * @type {Array} @@ -2938,7 +2899,6 @@ export declare enum AssetType { * @interface Assets */ export interface Assets { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -2952,7 +2912,6 @@ export interface Assets { * @interface AssetsErrorWebhook */ export interface AssetsErrorWebhook { - [key: string]: object | unknown; /** * `ASSETS` * @type {string} @@ -2996,7 +2955,6 @@ export interface AssetsErrorWebhook { * @interface AssetsProductReadyWebhook */ export interface AssetsProductReadyWebhook { - [key: string]: object | unknown; /** * `ASSETS` * @type {string} @@ -3040,7 +2998,6 @@ export interface AssetsProductReadyWebhook { * @interface AuthGetNumbers */ export interface AuthGetNumbers { - [key: string]: object | unknown; /** * An array of ACH numbers identifying accounts. * @type {Array} @@ -3116,7 +3073,6 @@ export interface AuthGetRequestOptions { * @interface AuthGetResponse */ export interface AuthGetResponse { - [key: string]: object | unknown; /** * The `accounts` for which numbers are being retrieved. * @type {Array} @@ -3148,7 +3104,6 @@ export interface AuthGetResponse { * @interface AuthMetadata */ export interface AuthMetadata { - [key: string]: object | unknown; /** * * @type {AuthSupportedMethods} @@ -3162,7 +3117,6 @@ export interface AuthMetadata { * @interface AuthSupportedMethods */ export interface AuthSupportedMethods { - [key: string]: object | unknown; /** * Indicates if instant auth is supported. * @type {boolean} @@ -3194,7 +3148,6 @@ export interface AuthSupportedMethods { * @interface AutomaticallyVerifiedWebhook */ export interface AutomaticallyVerifiedWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -3247,7 +3200,6 @@ export declare enum BankIncomeCompleteResult { * @interface BankIncomeCompleteWebhook */ export interface BankIncomeCompleteWebhook { - [key: string]: object | unknown; /** * `INCOME` * @type {string} @@ -3294,7 +3246,6 @@ export declare enum BankIncomeRefreshCompleteResult { * @interface BankIncomeRefreshCompleteWebhook */ export interface BankIncomeRefreshCompleteWebhook { - [key: string]: object | unknown; /** * `INCOME` * @type {string} @@ -3332,7 +3283,6 @@ export interface BankIncomeRefreshCompleteWebhook { * @interface BankIncomeRefreshUpdateWebhook */ export interface BankIncomeRefreshUpdateWebhook { - [key: string]: object | unknown; /** * `INCOME` * @type {string} @@ -3383,7 +3333,6 @@ export interface BankInitiatedReturnRisk { * @interface BankTransfer */ export interface BankTransfer { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a bank transfer. * @type {string} @@ -3495,7 +3444,6 @@ export interface BankTransfer { * @interface BankTransferBalance */ export interface BankTransferBalance { - [key: string]: object | unknown; /** * The total available balance - the sum of all successful debit transfer amounts minus all credit transfer amounts. * @type {string} @@ -3540,7 +3488,6 @@ export interface BankTransferBalanceGetRequest { * @interface BankTransferBalanceGetResponse */ export interface BankTransferBalanceGetResponse { - [key: string]: object | unknown; /** * * @type {BankTransferBalance} @@ -3591,7 +3538,6 @@ export interface BankTransferCancelRequest { * @interface BankTransferCancelResponse */ export interface BankTransferCancelResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -3704,7 +3650,6 @@ export interface BankTransferCreateRequest { * @interface BankTransferCreateResponse */ export interface BankTransferCreateResponse { - [key: string]: object | unknown; /** * * @type {BankTransfer} @@ -3734,7 +3679,6 @@ export declare enum BankTransferDirection { * @interface BankTransferEvent */ export interface BankTransferEvent { - [key: string]: object | unknown; /** * Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers. * @type {number} @@ -3907,7 +3851,6 @@ export interface BankTransferEventListRequest { * @interface BankTransferEventListResponse */ export interface BankTransferEventListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -3958,7 +3901,6 @@ export interface BankTransferEventSyncRequest { * @interface BankTransferEventSyncResponse */ export interface BankTransferEventSyncResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -3990,7 +3932,6 @@ export declare enum BankTransferEventType { * @interface BankTransferFailure */ export interface BankTransferFailure { - [key: string]: object | unknown; /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the transfer status is `reversed`. For a full listing of ACH return codes, see [Bank Transfers errors](https://plaid.com/docs/errors/bank-transfers/#ach-return-codes). * @type {string} @@ -4035,7 +3976,6 @@ export interface BankTransferGetRequest { * @interface BankTransferGetResponse */ export interface BankTransferGetResponse { - [key: string]: object | unknown; /** * * @type {BankTransfer} @@ -4110,7 +4050,6 @@ export interface BankTransferListRequest { * @interface BankTransferListResponse */ export interface BankTransferListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -4173,7 +4112,6 @@ export interface BankTransferMigrateAccountRequest { * @interface BankTransferMigrateAccountResponse */ export interface BankTransferMigrateAccountResponse { - [key: string]: object | unknown; /** * The Plaid `access_token` for the newly created Item. * @type {string} @@ -4221,7 +4159,6 @@ export declare enum BankTransferStatus { * @interface BankTransferSweep */ export interface BankTransferSweep { - [key: string]: object | unknown; /** * Identifier of the sweep. * @type {string} @@ -4278,7 +4215,6 @@ export interface BankTransferSweepGetRequest { * @interface BankTransferSweepGetResponse */ export interface BankTransferSweepGetResponse { - [key: string]: object | unknown; /** * * @type {BankTransferSweep} @@ -4341,7 +4277,6 @@ export interface BankTransferSweepListRequest { * @interface BankTransferSweepListResponse */ export interface BankTransferSweepListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -4370,7 +4305,6 @@ export declare enum BankTransferType { * @interface BankTransferUser */ export interface BankTransferUser { - [key: string]: object | unknown; /** * The account holder’s full legal name. If the transfer `ach_class` is `ccd`, this should be the business name of the account holder. * @type {string} @@ -4396,7 +4330,6 @@ export interface BankTransferUser { * @interface BankTransfersEventsUpdateWebhook */ export interface BankTransfersEventsUpdateWebhook { - [key: string]: object | unknown; /** * `BANK_TRANSFERS` * @type {string} @@ -4422,7 +4355,6 @@ export interface BankTransfersEventsUpdateWebhook { * @interface BankTransfersEventsUpdateWebhookForAuth */ export interface BankTransfersEventsUpdateWebhookForAuth { - [key: string]: object | unknown; /** * `BANK_TRANSFERS` * @type {string} @@ -4448,7 +4380,6 @@ export interface BankTransfersEventsUpdateWebhookForAuth { * @interface BaseReport */ export interface BaseReport { - [key: string]: object | unknown; /** * A unique ID identifying an Base Report. Like all Plaid identifiers, this ID is case sensitive. * @type {string} @@ -4480,7 +4411,6 @@ export interface BaseReport { * @interface BaseReportAccount */ export interface BaseReportAccount { - [key: string]: object | unknown; /** * * @type {BaseReportAccountBalances} @@ -4646,7 +4576,6 @@ export interface BaseReportAccountBalancesAllOf { * @interface BaseReportAccountInsights */ export interface BaseReportAccountInsights { - [key: string]: object | unknown; /** * Date of the earliest transaction in the base report for the account. * @type {string} @@ -4714,7 +4643,6 @@ export interface BaseReportAccountInsights { * @interface BaseReportAverageFlowInsights */ export interface BaseReportAverageFlowInsights { - [key: string]: object | unknown; /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4740,7 +4668,6 @@ export interface BaseReportAverageFlowInsights { * @interface BaseReportAverageMonthlyBalances */ export interface BaseReportAverageMonthlyBalances { - [key: string]: object | unknown; /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4791,7 +4718,6 @@ export interface BaseReportGetRequest { * @interface BaseReportGetResponse */ export interface BaseReportGetResponse { - [key: string]: object | unknown; /** * * @type {BaseReport} @@ -4817,7 +4743,6 @@ export interface BaseReportGetResponse { * @interface BaseReportItem */ export interface BaseReportItem { - [key: string]: object | unknown; /** * The full financial institution name associated with the Item. * @type {string} @@ -4849,7 +4774,6 @@ export interface BaseReportItem { * @interface BaseReportLongestGapInsights */ export interface BaseReportLongestGapInsights { - [key: string]: object | unknown; /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4875,7 +4799,6 @@ export interface BaseReportLongestGapInsights { * @interface BaseReportNumberFlowInsights */ export interface BaseReportNumberFlowInsights { - [key: string]: object | unknown; /** * The start date of this time period. The date will be returned in an ISO 8601 format (YYYY-MM-DD). * @type {string} @@ -4901,7 +4824,6 @@ export interface BaseReportNumberFlowInsights { * @interface BaseReportTransaction */ export interface BaseReportTransaction { - [key: string]: object | unknown; /** * The settled value of the transaction, denominated in the transaction\'s currency, as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, debit card purchases are positive; credit card payments, direct deposits, and refunds are negative. * @type {number} @@ -4981,7 +4903,6 @@ export interface BaseReportTransaction { * @interface BaseReportWarning */ export interface BaseReportWarning { - [key: string]: object | unknown; /** * The warning type, which will always be `BASE_REPORT_WARNING` * @type {string} @@ -5016,7 +4937,6 @@ export declare enum BaseReportWarningCode { * @interface BaseReportsErrorWebhook */ export interface BaseReportsErrorWebhook { - [key: string]: object | unknown; /** * `BASE_REPORT` * @type {string} @@ -5054,7 +4974,6 @@ export interface BaseReportsErrorWebhook { * @interface BaseReportsProductReadyWebhook */ export interface BaseReportsProductReadyWebhook { - [key: string]: object | unknown; /** * `BASE_REPORT` * @type {string} @@ -5086,7 +5005,6 @@ export interface BaseReportsProductReadyWebhook { * @interface BeaconAuditTrail */ export interface BeaconAuditTrail { - [key: string]: object | unknown; /** * * @type {BeaconAuditTrailSource} @@ -5117,7 +5035,6 @@ export declare enum BeaconAuditTrailSource { * @interface BeaconDuplicateDetectedWebhook */ export interface BeaconDuplicateDetectedWebhook { - [key: string]: object | unknown; /** * `BEACON` * @type {string} @@ -5174,7 +5091,6 @@ export interface BeaconDuplicateGetRequest { * @interface BeaconDuplicateGetResponse */ export interface BeaconDuplicateGetResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon Duplicate. * @type {string} @@ -5212,7 +5128,6 @@ export interface BeaconDuplicateGetResponse { * @interface BeaconMatchSummaryAnalysis */ export interface BeaconMatchSummaryAnalysis { - [key: string]: object | unknown; /** * * @type {BeaconMatchSummaryCode} @@ -5273,7 +5188,6 @@ export declare enum BeaconMatchSummaryCode { * @interface BeaconReport */ export interface BeaconReport { - [key: string]: object | unknown; /** * ID of the associated Beacon Report. * @type {string} @@ -5366,7 +5280,6 @@ export interface BeaconReportCreateRequest { * @interface BeaconReportCreateResponse */ export interface BeaconReportCreateResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon Report. * @type {string} @@ -5422,7 +5335,6 @@ export interface BeaconReportCreateResponse { * @interface BeaconReportCreatedWebhook */ export interface BeaconReportCreatedWebhook { - [key: string]: object | unknown; /** * `BEACON` * @type {string} @@ -5479,7 +5391,6 @@ export interface BeaconReportGetRequest { * @interface BeaconReportGetResponse */ export interface BeaconReportGetResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon Report. * @type {string} @@ -5566,7 +5477,6 @@ export interface BeaconReportListRequest { * @interface BeaconReportListResponse */ export interface BeaconReportListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -5592,7 +5502,6 @@ export interface BeaconReportListResponse { * @interface BeaconReportSyndication */ export interface BeaconReportSyndication { - [key: string]: object | unknown; /** * ID of the associated Beacon Report Syndication. * @type {string} @@ -5618,7 +5527,6 @@ export interface BeaconReportSyndication { * @interface BeaconReportSyndicationAnalysis */ export interface BeaconReportSyndicationAnalysis { - [key: string]: object | unknown; /** * * @type {BeaconMatchSummaryCode} @@ -5668,7 +5576,6 @@ export interface BeaconReportSyndicationAnalysis { * @interface BeaconReportSyndicationCreatedWebhook */ export interface BeaconReportSyndicationCreatedWebhook { - [key: string]: object | unknown; /** * `BEACON` * @type {string} @@ -5725,7 +5632,6 @@ export interface BeaconReportSyndicationGetRequest { * @interface BeaconReportSyndicationGetResponse */ export interface BeaconReportSyndicationGetResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon Report Syndication. * @type {string} @@ -5788,7 +5694,6 @@ export interface BeaconReportSyndicationListRequest { * @interface BeaconReportSyndicationListResponse */ export interface BeaconReportSyndicationListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -5814,7 +5719,6 @@ export interface BeaconReportSyndicationListResponse { * @interface BeaconReportSyndicationOriginalReport */ export interface BeaconReportSyndicationOriginalReport { - [key: string]: object | unknown; /** * ID of the associated Beacon Report. * @type {string} @@ -5858,7 +5762,6 @@ export declare enum BeaconReportType { * @interface BeaconReportUpdatedWebhook */ export interface BeaconReportUpdatedWebhook { - [key: string]: object | unknown; /** * `BEACON` * @type {string} @@ -5890,7 +5793,6 @@ export interface BeaconReportUpdatedWebhook { * @interface BeaconUserAddress */ export interface BeaconUserAddress { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -5971,7 +5873,6 @@ export interface BeaconUserCreateRequest { * @interface BeaconUserCreateResponse */ export interface BeaconUserCreateResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon User. * @type {string} @@ -6033,7 +5934,6 @@ export interface BeaconUserCreateResponse { * @interface BeaconUserData */ export interface BeaconUserData { - [key: string]: object | unknown; /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6108,7 +6008,6 @@ export interface BeaconUserGetRequest { * @interface BeaconUserGetResponse */ export interface BeaconUserGetResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon User. * @type {string} @@ -6170,7 +6069,6 @@ export interface BeaconUserGetResponse { * @interface BeaconUserIDNumber */ export interface BeaconUserIDNumber { - [key: string]: object | unknown; /** * Value of identity document value typed in by user. Alpha-numeric, with all formatting characters stripped. * @type {string} @@ -6190,7 +6088,6 @@ export interface BeaconUserIDNumber { * @interface BeaconUserName */ export interface BeaconUserName { - [key: string]: object | unknown; /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -6210,7 +6107,6 @@ export interface BeaconUserName { * @interface BeaconUserNameNullable */ export interface BeaconUserNameNullable { - [key: string]: object | unknown; /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -6230,7 +6126,6 @@ export interface BeaconUserNameNullable { * @interface BeaconUserRequestAddress */ export interface BeaconUserRequestAddress { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -6274,7 +6169,6 @@ export interface BeaconUserRequestAddress { * @interface BeaconUserRequestAddressNullable */ export interface BeaconUserRequestAddressNullable { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -6318,7 +6212,6 @@ export interface BeaconUserRequestAddressNullable { * @interface BeaconUserRequestData */ export interface BeaconUserRequestData { - [key: string]: object | unknown; /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6399,7 +6292,6 @@ export interface BeaconUserReviewRequest { * @interface BeaconUserRevision */ export interface BeaconUserRevision { - [key: string]: object | unknown; /** * ID of the associated Beacon User. * @type {string} @@ -6429,7 +6321,6 @@ export declare enum BeaconUserStatus { * @interface BeaconUserStatusUpdatedWebhook */ export interface BeaconUserStatusUpdatedWebhook { - [key: string]: object | unknown; /** * `BEACON` * @type {string} @@ -6492,7 +6383,6 @@ export interface BeaconUserUpdateRequest { * @interface BeaconUserUpdateRequestData */ export interface BeaconUserUpdateRequestData { - [key: string]: object | unknown; /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -6542,7 +6432,6 @@ export interface BeaconUserUpdateRequestData { * @interface BeaconUserUpdateResponse */ export interface BeaconUserUpdateResponse { - [key: string]: object | unknown; /** * ID of the associated Beacon User. * @type {string} @@ -6604,7 +6493,6 @@ export interface BeaconUserUpdateResponse { * @interface CategoriesGetResponse */ export interface CategoriesGetResponse { - [key: string]: object | unknown; /** * An array of all of the transaction categories used by Plaid. * @type {Array} @@ -6624,7 +6512,6 @@ export interface CategoriesGetResponse { * @interface Category */ export interface Category { - [key: string]: object | unknown; /** * An identifying number for the category. `category_id` is a Plaid-specific identifier and does not necessarily correspond to merchant category codes. * @type {string} @@ -6650,7 +6537,6 @@ export interface Category { * @interface CategoryInsightDetails */ export interface CategoryInsightDetails { - [key: string]: object | unknown; /** * Category name. * @type {string} @@ -6688,7 +6574,6 @@ export interface CategoryInsightDetails { * @interface CategoryInsights */ export interface CategoryInsights { - [key: string]: object | unknown; /** * List of insights of top primary personal finance categories ranked by outflow. * @type {Array} @@ -6788,7 +6673,6 @@ export interface CauseAllOf { * @interface ClientProvidedEnhancedTransaction */ export interface ClientProvidedEnhancedTransaction { - [key: string]: object | unknown; /** * Unique transaction identifier to tie transactions back to clients\' systems. * @type {string} @@ -6826,7 +6710,6 @@ export interface ClientProvidedEnhancedTransaction { * @interface ClientProvidedEnrichedTransaction */ export interface ClientProvidedEnrichedTransaction { - [key: string]: object | unknown; /** * The unique ID for the transaction as provided by you in the request. * @type {string} @@ -6894,7 +6777,6 @@ export interface ClientProvidedEnrichedTransaction { * @interface ClientProvidedRawTransaction */ export interface ClientProvidedRawTransaction { - [key: string]: object | unknown; /** * A unique ID for the transaction used to help you tie data back to your systems. * @type {string} @@ -6926,7 +6808,6 @@ export interface ClientProvidedRawTransaction { * @interface ClientProvidedTransaction */ export interface ClientProvidedTransaction { - [key: string]: object | unknown; /** * A unique ID for the transaction used to help you tie data back to your systems. * @type {string} @@ -7006,7 +6887,6 @@ export interface ClientProvidedTransaction { * @interface ClientProvidedTransactionLocation */ export interface ClientProvidedTransactionLocation { - [key: string]: object | unknown; /** * The country where the transaction occurred. * @type {string} @@ -7114,7 +6994,6 @@ export declare enum ConsumerReportPermissiblePurpose { * @interface ConsumerReportUserIdentity */ export interface ConsumerReportUserIdentity { - [key: string]: object | unknown; /** * The user\'s first name * @type {string} @@ -7152,7 +7031,6 @@ export interface ConsumerReportUserIdentity { * @interface Counterparty */ export interface Counterparty { - [key: string]: object | unknown; /** * The name of the counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -7202,7 +7080,6 @@ export interface Counterparty { * @interface CounterpartyInsights */ export interface CounterpartyInsights { - [key: string]: object | unknown; /** * Insights related to a user’s transactions with other financial institutions, including detected account types. * @type {Array} @@ -7386,7 +7263,6 @@ export declare enum CraBankIncomeCompleteResult { * @interface CraBankIncomeCompleteWebhook */ export interface CraBankIncomeCompleteWebhook { - [key: string]: object | unknown; /** * `CRA_INCOME` * @type {string} @@ -7424,7 +7300,6 @@ export interface CraBankIncomeCompleteWebhook { * @interface CraBankIncomeEmployer */ export interface CraBankIncomeEmployer { - [key: string]: object | unknown; /** * The name of the employer. * @type {string} @@ -7463,7 +7338,6 @@ export interface CraBankIncomeGetRequest { * @interface CraBankIncomeGetResponse */ export interface CraBankIncomeGetResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -7483,7 +7357,6 @@ export interface CraBankIncomeGetResponse { * @interface CraBankIncomeHistoricalSummary */ export interface CraBankIncomeHistoricalSummary { - [key: string]: object | unknown; /** * Total amount of earnings for the income source(s) of the user for the month in the summary. This can contain multiple amounts, with each amount denominated in one unique currency. * @type {Array} @@ -7655,7 +7528,6 @@ export interface CraBankIncomeSource { * @interface CraBankIncomeSummary */ export interface CraBankIncomeSummary { - [key: string]: object | unknown; /** * Total amount of earnings across all the income sources in the end user\'s Items for the days requested by the client. This can contain multiple amounts, with each amount denominated in one unique currency. * @type {Array} @@ -7723,7 +7595,6 @@ export interface CraBankIncomeSummary { * @interface CraBankIncomeTransaction */ export interface CraBankIncomeTransaction { - [key: string]: object | unknown; /** * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} @@ -7815,7 +7686,6 @@ export declare enum CraBankIncomeWarningCode { * @interface Credit1099 */ export interface Credit1099 { - [key: string]: object | unknown; /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -8135,7 +8005,6 @@ export interface Credit1099 { * @interface Credit1099Filer */ export interface Credit1099Filer { - [key: string]: object | unknown; /** * * @type {CreditPayStubAddress} @@ -8167,7 +8036,6 @@ export interface Credit1099Filer { * @interface Credit1099Payer */ export interface Credit1099Payer { - [key: string]: object | unknown; /** * * @type {CreditPayStubAddress} @@ -8199,7 +8067,6 @@ export interface Credit1099Payer { * @interface Credit1099Recipient */ export interface Credit1099Recipient { - [key: string]: object | unknown; /** * * @type {CreditPayStubAddress} @@ -8263,7 +8130,6 @@ export declare enum CreditAccountSubtype { * @interface CreditAmountWithCurrency */ export interface CreditAmountWithCurrency { - [key: string]: object | unknown; /** * Value of amount with up to 2 decimal places. * @type {number} @@ -8314,7 +8180,6 @@ export interface CreditAuditCopyTokenCreateRequest { * @interface CreditAuditCopyTokenCreateResponse */ export interface CreditAuditCopyTokenCreateResponse { - [key: string]: object | unknown; /** * A token that can be shared with a third party auditor, which allows them to fetch the Asset Reports attached to the token. This token should be stored securely. * @type {string} @@ -8359,7 +8224,6 @@ export interface CreditAuditCopyTokenRemoveRequest { * @interface CreditAuditCopyTokenRemoveResponse */ export interface CreditAuditCopyTokenRemoveResponse { - [key: string]: object | unknown; /** * `true` if the Audit Copy was successfully removed. * @type {boolean} @@ -8410,7 +8274,6 @@ export interface CreditAuditCopyTokenUpdateRequest { * @interface CreditAuditCopyTokenUpdateResponse */ export interface CreditAuditCopyTokenUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -8505,7 +8368,6 @@ export interface CreditBankEmploymentGetRequest { * @interface CreditBankEmploymentGetResponse */ export interface CreditBankEmploymentGetResponse { - [key: string]: object | unknown; /** * Bank Employment data. Each entry in the array will be a distinct bank employment report. * @type {Array} @@ -8864,7 +8726,6 @@ export interface CreditBankIncomeGetRequestOptions { * @interface CreditBankIncomeGetResponse */ export interface CreditBankIncomeGetResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -8884,7 +8745,6 @@ export interface CreditBankIncomeGetResponse { * @interface CreditBankIncomeHistoricalSummary */ export interface CreditBankIncomeHistoricalSummary { - [key: string]: object | unknown; /** * Total amount of earnings for the income source(s) of the user for the month in the summary. This may return an incorrect value if the summary includes income sources in multiple currencies. Please use [`total_amounts`](https://plaid.com/docs/api/products/income/#credit-bank_income-get-response-bank-income-items-bank-income-sources-historical-summary-total-amounts) instead. * @type {number} @@ -9062,7 +8922,6 @@ export interface CreditBankIncomeRefreshRequestOptions { * @interface CreditBankIncomeRefreshResponse */ export interface CreditBankIncomeRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -9143,7 +9002,6 @@ export interface CreditBankIncomeSource { * @interface CreditBankIncomeSummary */ export interface CreditBankIncomeSummary { - [key: string]: object | unknown; /** * Total amount of earnings across all the income sources in the end user\'s Items for the days requested by the client. This may return an incorrect value if the summary includes income sources in multiple currencies. Please use [`total_amounts`](https://plaid.com/docs/api/products/income/#credit-bank_income-get-response-bank-income-bank-income-summary-total-amounts) instead. * @type {number} @@ -9214,7 +9072,6 @@ export interface CreditBankIncomeSummary { * @interface CreditBankIncomeTransaction */ export interface CreditBankIncomeTransaction { - [key: string]: object | unknown; /** * The settled value of the transaction, denominated in the transactions\'s currency as stated in `iso_currency_code` or `unofficial_currency_code`. Positive values when money moves out of the account; negative values when money moves in. For example, credit card purchases are positive; credit card payment, direct deposits, and refunds are negative. * @type {number} @@ -9352,7 +9209,6 @@ export interface CreditBankIncomeWebhookUpdateRequest { * @interface CreditBankIncomeWebhookUpdateResponse */ export interface CreditBankIncomeWebhookUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -9366,7 +9222,6 @@ export interface CreditBankIncomeWebhookUpdateResponse { * @interface CreditBankStatementUploadAccountOwner */ export interface CreditBankStatementUploadAccountOwner { - [key: string]: object | unknown; /** * The name of the account owner * @type {string} @@ -9386,7 +9241,6 @@ export interface CreditBankStatementUploadAccountOwner { * @interface CreditBankStatementUploadAccountOwnerAddress */ export interface CreditBankStatementUploadAccountOwnerAddress { - [key: string]: object | unknown; /** * The full city name. * @type {string} @@ -9424,7 +9278,6 @@ export interface CreditBankStatementUploadAccountOwnerAddress { * @interface CreditBankStatementUploadBankAccount */ export interface CreditBankStatementUploadBankAccount { - [key: string]: object | unknown; /** * The name of the bank account * @type {string} @@ -9536,7 +9389,6 @@ export interface CreditBankStatementUploadItem { * @interface CreditBankStatementUploadObject */ export interface CreditBankStatementUploadObject { - [key: string]: object | unknown; /** * An array of transactions appearing on the bank statement. * @type {Array} @@ -9624,7 +9476,6 @@ export interface CreditBankStatementsUploadsGetRequest { * @interface CreditBankStatementsUploadsGetResponse */ export interface CreditBankStatementsUploadsGetResponse { - [key: string]: object | unknown; /** * Array of bank statement upload items. * @type {Array} @@ -9644,7 +9495,6 @@ export interface CreditBankStatementsUploadsGetResponse { * @interface CreditCardLiability */ export interface CreditCardLiability { - [key: string]: object | unknown; /** * The ID of the account that this liability belongs to. * @type {string} @@ -9706,7 +9556,6 @@ export interface CreditCardLiability { * @interface CreditCategory */ export interface CreditCategory { - [key: string]: object | unknown; /** * A high level category that communicates the broad category of the transaction. * @type {string} @@ -9726,7 +9575,6 @@ export interface CreditCategory { * @interface CreditDocumentMetadata */ export interface CreditDocumentMetadata { - [key: string]: object | unknown; /** * The name of the document. * @type {string} @@ -9764,7 +9612,6 @@ export interface CreditDocumentMetadata { * @interface CreditEmployerVerification */ export interface CreditEmployerVerification { - [key: string]: object | unknown; /** * Name of employer. * @type {string} @@ -9803,7 +9650,6 @@ export interface CreditEmploymentGetRequest { * @interface CreditEmploymentGetResponse */ export interface CreditEmploymentGetResponse { - [key: string]: object | unknown; /** * Array of employment items. * @type {Array} @@ -9823,7 +9669,6 @@ export interface CreditEmploymentGetResponse { * @interface CreditEmploymentItem */ export interface CreditEmploymentItem { - [key: string]: object | unknown; /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -9849,7 +9694,6 @@ export interface CreditEmploymentItem { * @interface CreditEmploymentVerification */ export interface CreditEmploymentVerification { - [key: string]: object | unknown; /** * ID of the payroll provider account. * @type {string} @@ -9911,7 +9755,6 @@ export interface CreditEmploymentVerification { * @interface CreditFilter */ export interface CreditFilter { - [key: string]: object | unknown; /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -9925,7 +9768,6 @@ export interface CreditFilter { * @interface CreditFreddieMacAsset */ export interface CreditFreddieMacAsset { - [key: string]: object | unknown; /** * * @type {AssetDetail} @@ -9963,7 +9805,6 @@ export interface CreditFreddieMacAsset { * @interface CreditFreddieMacAssetTransaction */ export interface CreditFreddieMacAssetTransaction { - [key: string]: object | unknown; /** * * @type {AssetTransactionDetail} @@ -9983,7 +9824,6 @@ export interface CreditFreddieMacAssetTransaction { * @interface CreditFreddieMacAssetTransactions */ export interface CreditFreddieMacAssetTransactions { - [key: string]: object | unknown; /** * * @type {Array} @@ -9997,7 +9837,6 @@ export interface CreditFreddieMacAssetTransactions { * @interface CreditFreddieMacAssets */ export interface CreditFreddieMacAssets { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -10011,7 +9850,6 @@ export interface CreditFreddieMacAssets { * @interface CreditFreddieMacIndividualName */ export interface CreditFreddieMacIndividualName { - [key: string]: object | unknown; /** * The first name of the individual represented by the parent object. * @type {string} @@ -10037,7 +9875,6 @@ export interface CreditFreddieMacIndividualName { * @interface CreditFreddieMacLoan */ export interface CreditFreddieMacLoan { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacLoanIdentifiers} @@ -10057,7 +9894,6 @@ export interface CreditFreddieMacLoan { * @interface CreditFreddieMacLoanIdentifiers */ export interface CreditFreddieMacLoanIdentifiers { - [key: string]: object | unknown; /** * * @type {Array} @@ -10071,7 +9907,6 @@ export interface CreditFreddieMacLoanIdentifiers { * @interface CreditFreddieMacLoans */ export interface CreditFreddieMacLoans { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacLoan} @@ -10085,7 +9920,6 @@ export interface CreditFreddieMacLoans { * @interface CreditFreddieMacParties */ export interface CreditFreddieMacParties { - [key: string]: object | unknown; /** * * @type {Array} @@ -10099,7 +9933,6 @@ export interface CreditFreddieMacParties { * @interface CreditFreddieMacParty */ export interface CreditFreddieMacParty { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacPartyIndividual} @@ -10125,7 +9958,6 @@ export interface CreditFreddieMacParty { * @interface CreditFreddieMacPartyIndividual */ export interface CreditFreddieMacPartyIndividual { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacIndividualName} @@ -10139,7 +9971,6 @@ export interface CreditFreddieMacPartyIndividual { * @interface CreditFreddieMacReportingInformation */ export interface CreditFreddieMacReportingInformation { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -10196,7 +10027,6 @@ export interface CreditFreddieMacReportsGetRequest { * @interface CreditFreddieMacReportsGetResponse */ export interface CreditFreddieMacReportsGetResponse { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacVerificationOfAssetsDeal} @@ -10222,7 +10052,6 @@ export interface CreditFreddieMacReportsGetResponse { * @interface CreditFreddieMacService */ export interface CreditFreddieMacService { - [key: string]: object | unknown; /** * * @type {Array} @@ -10242,7 +10071,6 @@ export interface CreditFreddieMacService { * @interface CreditFreddieMacServices */ export interface CreditFreddieMacServices { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacService} @@ -10256,7 +10084,6 @@ export interface CreditFreddieMacServices { * @interface CreditFreddieMacVerificationOfAsset */ export interface CreditFreddieMacVerificationOfAsset { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacReportingInformation} @@ -10282,7 +10109,6 @@ export interface CreditFreddieMacVerificationOfAsset { * @interface CreditFreddieMacVerificationOfAssetResponse */ export interface CreditFreddieMacVerificationOfAssetResponse { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacAssets} @@ -10296,7 +10122,6 @@ export interface CreditFreddieMacVerificationOfAssetResponse { * @interface CreditFreddieMacVerificationOfAssetsDeal */ export interface CreditFreddieMacVerificationOfAssetsDeal { - [key: string]: object | unknown; /** * * @type {CreditFreddieMacLoans} @@ -10322,7 +10147,6 @@ export interface CreditFreddieMacVerificationOfAssetsDeal { * @interface CreditPayStub */ export interface CreditPayStub { - [key: string]: object | unknown; /** * * @type {CreditPayStubDeductions} @@ -10378,7 +10202,6 @@ export interface CreditPayStub { * @interface CreditPayStubAddress */ export interface CreditPayStubAddress { - [key: string]: object | unknown; /** * The full city name. * @type {string} @@ -10416,7 +10239,6 @@ export interface CreditPayStubAddress { * @interface CreditPayStubDeductions */ export interface CreditPayStubDeductions { - [key: string]: object | unknown; /** * * @type {Array} @@ -10436,7 +10258,6 @@ export interface CreditPayStubDeductions { * @interface CreditPayStubEarnings */ export interface CreditPayStubEarnings { - [key: string]: object | unknown; /** * * @type {Array} @@ -10456,7 +10277,6 @@ export interface CreditPayStubEarnings { * @interface CreditPayStubEmployee */ export interface CreditPayStubEmployee { - [key: string]: object | unknown; /** * * @type {CreditPayStubAddress} @@ -10488,7 +10308,6 @@ export interface CreditPayStubEmployee { * @interface CreditPayStubEmployer */ export interface CreditPayStubEmployer { - [key: string]: object | unknown; /** * * @type {CreditPayStubAddress} @@ -10508,7 +10327,6 @@ export interface CreditPayStubEmployer { * @interface CreditPayStubNetPay */ export interface CreditPayStubNetPay { - [key: string]: object | unknown; /** * Raw amount of the net pay for the pay period. * @type {number} @@ -10581,7 +10399,6 @@ export interface CreditPayrollIncomeGetRequest { * @interface CreditPayrollIncomeGetResponse */ export interface CreditPayrollIncomeGetResponse { - [key: string]: object | unknown; /** * Array of payroll items. * @type {Array} @@ -10607,7 +10424,6 @@ export interface CreditPayrollIncomeGetResponse { * @interface CreditPayrollIncomeParsingConfigUpdateRequest */ export interface CreditPayrollIncomeParsingConfigUpdateRequest { - [key: string]: object | unknown; /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. * @type {string} @@ -10645,7 +10461,6 @@ export interface CreditPayrollIncomeParsingConfigUpdateRequest { * @interface CreditPayrollIncomeParsingConfigUpdateResponse */ export interface CreditPayrollIncomeParsingConfigUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -10708,7 +10523,6 @@ export interface CreditPayrollIncomePrecheckRequest { * @interface CreditPayrollIncomePrecheckResponse */ export interface CreditPayrollIncomePrecheckResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -10778,7 +10592,6 @@ export interface CreditPayrollIncomeRefreshRequestOptions { * @interface CreditPayrollIncomeRefreshResponse */ export interface CreditPayrollIncomeRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -10823,7 +10636,6 @@ export interface CreditPayrollIncomeRiskSignalsGetRequest { * @interface CreditPayrollIncomeRiskSignalsGetResponse */ export interface CreditPayrollIncomeRiskSignalsGetResponse { - [key: string]: object | unknown; /** * Array of payroll items. * @type {Array} @@ -10849,7 +10661,6 @@ export interface CreditPayrollIncomeRiskSignalsGetResponse { * @interface CreditPlatformIds */ export interface CreditPlatformIds { - [key: string]: object | unknown; /** * The ID of an employee as given by their employer. * @type {string} @@ -10912,7 +10723,6 @@ export interface CreditRelayCreateRequest { * @interface CreditRelayCreateResponse */ export interface CreditRelayCreateResponse { - [key: string]: object | unknown; /** * A token that can be shared with a third party to allow them to access the Asset Report. This token should be stored securely. * @type {string} @@ -11031,7 +10841,6 @@ export interface CreditRelayRefreshRequest { * @interface CreditRelayRefreshResponse */ export interface CreditRelayRefreshResponse { - [key: string]: object | unknown; /** * * @type {string} @@ -11082,7 +10891,6 @@ export interface CreditRelayRemoveRequest { * @interface CreditRelayRemoveResponse */ export interface CreditRelayRemoveResponse { - [key: string]: object | unknown; /** * `true` if the relay token was successfully removed. * @type {boolean} @@ -11377,7 +11185,6 @@ export interface CreditSessionsGetRequest { * @interface CreditSessionsGetResponse */ export interface CreditSessionsGetResponse { - [key: string]: object | unknown; /** * A list of Link sessions for the user. Sessions will be sorted in reverse chronological order. * @type {Array} @@ -11397,7 +11204,6 @@ export interface CreditSessionsGetResponse { * @interface CreditW2 */ export interface CreditW2 { - [key: string]: object | unknown; /** * * @type {CreditDocumentMetadata} @@ -11562,7 +11368,6 @@ export interface CustomerInitiatedReturnRisk { * @interface DashboardUser */ export interface DashboardUser { - [key: string]: object | unknown; /** * ID of the associated user. * @type {string} @@ -11619,7 +11424,6 @@ export interface DashboardUserGetRequest { * @interface DashboardUserGetResponse */ export interface DashboardUserGetResponse { - [key: string]: object | unknown; /** * ID of the associated user. * @type {string} @@ -11682,7 +11486,6 @@ export interface DashboardUserListRequest { * @interface DashboardUserListResponse */ export interface DashboardUserListResponse { - [key: string]: object | unknown; /** * List of dashboard users * @type {Array} @@ -11718,7 +11521,6 @@ export declare enum DashboardUserStatus { * @interface DateRange */ export interface DateRange { - [key: string]: object | unknown; /** * A date in the format YYYY-MM-DD (RFC 3339 Section 5.6). * @type {string} @@ -11738,7 +11540,6 @@ export interface DateRange { * @interface Deductions */ export interface Deductions { - [key: string]: object | unknown; /** * * @type {Array} @@ -11772,7 +11573,6 @@ export interface Deductions { * @interface DeductionsBreakdown */ export interface DeductionsBreakdown { - [key: string]: object | unknown; /** * Raw amount of the deduction * @type {number} @@ -11810,7 +11610,6 @@ export interface DeductionsBreakdown { * @interface DeductionsTotal */ export interface DeductionsTotal { - [key: string]: object | unknown; /** * Raw amount of the deduction * @type {number} @@ -11842,7 +11641,6 @@ export interface DeductionsTotal { * @interface DefaultUpdateWebhook */ export interface DefaultUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -11886,7 +11684,6 @@ export interface DefaultUpdateWebhook { * @interface DepositSwitchAddressData */ export interface DepositSwitchAddressData { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -11975,7 +11772,6 @@ export declare enum DepositSwitchAltCreateRequestCountryCodeEnum { * @interface DepositSwitchAltCreateResponse */ export interface DepositSwitchAltCreateResponse { - [key: string]: object | unknown; /** * ID of the deposit switch. This ID is persisted throughout the lifetime of the deposit switch. * @type {string} @@ -12065,7 +11861,6 @@ export interface DepositSwitchCreateRequestOptions { * @interface DepositSwitchCreateResponse */ export interface DepositSwitchCreateResponse { - [key: string]: object | unknown; /** * ID of the deposit switch. This ID is persisted throughout the lifetime of the deposit switch. * @type {string} @@ -12110,7 +11905,6 @@ export interface DepositSwitchGetRequest { * @interface DepositSwitchGetResponse */ export interface DepositSwitchGetResponse { - [key: string]: object | unknown; /** * The ID of the deposit switch. * @type {string} @@ -12271,7 +12065,6 @@ export interface DepositSwitchStateUpdateWebhook { * @interface DepositSwitchTargetAccount */ export interface DepositSwitchTargetAccount { - [key: string]: object | unknown; /** * Account number for deposit switch destination * @type {string} @@ -12311,7 +12104,6 @@ export declare enum DepositSwitchTargetAccountAccountSubtypeEnum { * @interface DepositSwitchTargetUser */ export interface DepositSwitchTargetUser { - [key: string]: object | unknown; /** * The given name (first name) of the user. * @type {string} @@ -12380,7 +12172,6 @@ export interface DepositSwitchTokenCreateRequest { * @interface DepositSwitchTokenCreateResponse */ export interface DepositSwitchTokenCreateResponse { - [key: string]: object | unknown; /** * Deposit switch token, used to initialize Link for the Deposit Switch product * @type {string} @@ -12423,7 +12214,6 @@ export declare enum DepositoryAccountSubtype { * @interface DepositoryFilter */ export interface DepositoryFilter { - [key: string]: object | unknown; /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -12437,7 +12227,6 @@ export interface DepositoryFilter { * @interface DetailedOriginator */ export interface DetailedOriginator { - [key: string]: object | unknown; /** * Originator’s client ID. * @type {string} @@ -12463,7 +12252,6 @@ export interface DetailedOriginator { * @interface DetectedAccount */ export interface DetectedAccount { - [key: string]: object | unknown; /** * The detected account type (depository, credit, loan, investment etc.). * @type {string} @@ -12519,7 +12307,6 @@ export interface DetectedAccount { * @interface DistributionBreakdown */ export interface DistributionBreakdown { - [key: string]: object | unknown; /** * Name of the account for the given distribution. * @type {string} @@ -12595,7 +12382,6 @@ export declare enum DocType { * @interface DocumentAnalysis */ export interface DocumentAnalysis { - [key: string]: object | unknown; /** * * @type {DocumentAuthenticityMatchCode} @@ -12642,7 +12428,6 @@ export declare enum DocumentDateOfBirthMatchCode { * @interface DocumentMetadata */ export interface DocumentMetadata { - [key: string]: object | unknown; /** * The name of the document. * @type {string} @@ -12684,7 +12469,6 @@ export declare enum DocumentNameMatchCode { * @interface DocumentRiskSignal */ export interface DocumentRiskSignal { - [key: string]: object | unknown; /** * The result from the risk signal check. * @type {string} @@ -12740,7 +12524,6 @@ export interface DocumentRiskSignal { * @interface DocumentRiskSignalInstitutionMetadata */ export interface DocumentRiskSignalInstitutionMetadata { - [key: string]: object | unknown; /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -12754,7 +12537,6 @@ export interface DocumentRiskSignalInstitutionMetadata { * @interface DocumentRiskSignalsObject */ export interface DocumentRiskSignalsObject { - [key: string]: object | unknown; /** * ID of the payroll provider account. * @type {string} @@ -12780,7 +12562,6 @@ export interface DocumentRiskSignalsObject { * @interface DocumentRiskSummary */ export interface DocumentRiskSummary { - [key: string]: object | unknown; /** * A number between 0 and 100, inclusive, where a score closer to 0 indicates a document is likely to be trustworthy and a score closer to 100 indicates a document is likely to be fraudulent * @type {number} @@ -12804,7 +12585,6 @@ export declare enum DocumentStatus { * @interface DocumentaryVerification */ export interface DocumentaryVerification { - [key: string]: object | unknown; /** * The outcome status for the associated Identity Verification attempt\'s `documentary_verification` step. This field will always have the same value as `steps.documentary_verification`. * @type {string} @@ -12824,7 +12604,6 @@ export interface DocumentaryVerification { * @interface DocumentaryVerificationDocument */ export interface DocumentaryVerificationDocument { - [key: string]: object | unknown; /** * * @type {DocumentStatus} @@ -12868,7 +12647,6 @@ export interface DocumentaryVerificationDocument { * @interface Earnings */ export interface Earnings { - [key: string]: object | unknown; /** * * @type {Array} @@ -12902,7 +12680,6 @@ export interface Earnings { * @interface EarningsBreakdown */ export interface EarningsBreakdown { - [key: string]: object | unknown; /** * * @type {EarningsBreakdownCanonicalDescription} @@ -12975,7 +12752,6 @@ export declare enum EarningsBreakdownCanonicalDescription { * @interface EarningsTotal */ export interface EarningsTotal { - [key: string]: object | unknown; /** * Total amount of the earnings for this pay period * @type {number} @@ -13027,7 +12803,6 @@ export interface EarningsTotal { * @interface Email */ export interface Email { - [key: string]: object | unknown; /** * The email address. * @type {string} @@ -13062,7 +12837,6 @@ export declare enum EmailTypeEnum { * @interface EmailAddressMatchScore */ export interface EmailAddressMatchScore { - [key: string]: object | unknown; /** * Match score for normalized email. 100 is a perfect match, 99-70 is a partial match (matching the same email with different \'+\' extensions), anything below 70 is considered a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the email is missing from either the API or financial institution, this is null. * @type {number} @@ -13076,7 +12850,6 @@ export interface EmailAddressMatchScore { * @interface Employee */ export interface Employee { - [key: string]: object | unknown; /** * * @type {PaystubAddress} @@ -13127,7 +12900,6 @@ export interface EmployeeIncomeSummaryFieldString { * @interface Employer */ export interface Employer { - [key: string]: object | unknown; /** * Plaid\'s unique identifier for the employer. * @type {string} @@ -13178,7 +12950,6 @@ export interface EmployerIncomeSummaryFieldString { * @interface EmployerVerification */ export interface EmployerVerification { - [key: string]: object | unknown; /** * Name of employer. * @type {string} @@ -13223,7 +12994,6 @@ export interface EmployersSearchRequest { * @interface EmployersSearchResponse */ export interface EmployersSearchResponse { - [key: string]: object | unknown; /** * A list of employers matching the search criteria. * @type {Array} @@ -13243,7 +13013,6 @@ export interface EmployersSearchResponse { * @interface EmploymentDetails */ export interface EmploymentDetails { - [key: string]: object | unknown; /** * * @type {Pay} @@ -13273,7 +13042,6 @@ export declare enum EmploymentSourceType { * @interface EmploymentVerification */ export interface EmploymentVerification { - [key: string]: object | unknown; /** * * @type {EmploymentVerificationStatus} @@ -13342,7 +13110,6 @@ export interface EmploymentVerificationGetRequest { * @interface EmploymentVerificationGetResponse */ export interface EmploymentVerificationGetResponse { - [key: string]: object | unknown; /** * A list of employment verification summaries. * @type {Array} @@ -13372,7 +13139,6 @@ export declare enum EmploymentVerificationStatus { * @interface Enhancements */ export interface Enhancements { - [key: string]: object | unknown; /** * The name of the primary counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -13455,7 +13221,6 @@ export declare enum EnrichTransactionDirection { * @interface Enrichments */ export interface Enrichments { - [key: string]: object | unknown; /** * The check number of the transaction. This field is only populated for check transactions. * @type {string} @@ -13549,7 +13314,6 @@ export interface Enrichments { * @interface EntityDocument */ export interface EntityDocument { - [key: string]: object | unknown; /** * * @type {EntityDocumentType} @@ -13582,7 +13346,6 @@ export declare enum EntityDocumentType { * @interface EntityScreeningHitAnalysis */ export interface EntityScreeningHitAnalysis { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -13632,7 +13395,6 @@ export interface EntityScreeningHitAnalysis { * @interface EntityScreeningHitData */ export interface EntityScreeningHitData { - [key: string]: object | unknown; /** * Documents associated with the watchlist hit * @type {Array} @@ -13676,7 +13438,6 @@ export interface EntityScreeningHitData { * @interface EntityScreeningHitDocumentsItems */ export interface EntityScreeningHitDocumentsItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -13696,7 +13457,6 @@ export interface EntityScreeningHitDocumentsItems { * @interface EntityScreeningHitEmails */ export interface EntityScreeningHitEmails { - [key: string]: object | unknown; /** * A valid email address. * @type {string} @@ -13710,7 +13470,6 @@ export interface EntityScreeningHitEmails { * @interface EntityScreeningHitEmailsItems */ export interface EntityScreeningHitEmailsItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -13730,7 +13489,6 @@ export interface EntityScreeningHitEmailsItems { * @interface EntityScreeningHitNames */ export interface EntityScreeningHitNames { - [key: string]: object | unknown; /** * The full name of the entity. * @type {string} @@ -13756,7 +13514,6 @@ export interface EntityScreeningHitNames { * @interface EntityScreeningHitNamesItems */ export interface EntityScreeningHitNamesItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -13776,7 +13533,6 @@ export interface EntityScreeningHitNamesItems { * @interface EntityScreeningHitPhoneNumbers */ export interface EntityScreeningHitPhoneNumbers { - [key: string]: object | unknown; /** * * @type {PhoneType} @@ -13796,7 +13552,6 @@ export interface EntityScreeningHitPhoneNumbers { * @interface EntityScreeningHitUrls */ export interface EntityScreeningHitUrls { - [key: string]: object | unknown; /** * An \'http\' or \'https\' URL (must begin with either of those). * @type {string} @@ -13810,7 +13565,6 @@ export interface EntityScreeningHitUrls { * @interface EntityScreeningHitUrlsItems */ export interface EntityScreeningHitUrlsItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -13830,7 +13584,6 @@ export interface EntityScreeningHitUrlsItems { * @interface EntityScreeningHitsPhoneNumberItems */ export interface EntityScreeningHitsPhoneNumberItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -13850,7 +13603,6 @@ export interface EntityScreeningHitsPhoneNumberItems { * @interface EntityScreeningStatusUpdatedWebhook */ export interface EntityScreeningStatusUpdatedWebhook { - [key: string]: object | unknown; /** * `ENTITY_SCREENING` * @type {string} @@ -13903,7 +13655,6 @@ export declare enum EntityWatchlistCode { * @interface EntityWatchlistProgram */ export interface EntityWatchlistProgram { - [key: string]: object | unknown; /** * ID of the associated entity program. * @type {string} @@ -13959,7 +13710,6 @@ export interface EntityWatchlistProgram { * @interface EntityWatchlistScreening */ export interface EntityWatchlistScreening { - [key: string]: object | unknown; /** * ID of the associated entity screening. * @type {string} @@ -14003,7 +13753,6 @@ export interface EntityWatchlistScreening { * @interface EntityWatchlistScreeningHit */ export interface EntityWatchlistScreeningHit { - [key: string]: object | unknown; /** * ID of the associated entity screening hit. * @type {string} @@ -14071,7 +13820,6 @@ export interface EntityWatchlistScreeningHit { * @interface EntityWatchlistScreeningReview */ export interface EntityWatchlistScreeningReview { - [key: string]: object | unknown; /** * ID of the associated entity review. * @type {string} @@ -14109,7 +13857,6 @@ export interface EntityWatchlistScreeningReview { * @interface EntityWatchlistScreeningSearchTerms */ export interface EntityWatchlistScreeningSearchTerms { - [key: string]: object | unknown; /** * ID of the associated entity program. * @type {string} @@ -14305,7 +14052,6 @@ export interface ExternalPaymentRefundDetails { * @interface ExternalPaymentScheduleBase */ export interface ExternalPaymentScheduleBase { - [key: string]: object | unknown; /** * * @type {PaymentScheduleInterval} @@ -14735,7 +14481,6 @@ export declare enum FDXPartyType { * @interface FallbackAuthMicrodepositAutoVerifiedWebhook */ export interface FallbackAuthMicrodepositAutoVerifiedWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -14779,7 +14524,6 @@ export interface FallbackAuthMicrodepositAutoVerifiedWebhook { * @interface FallbackAuthMicrodepositVerificationExpiredWebhook */ export interface FallbackAuthMicrodepositVerificationExpiredWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -14864,7 +14608,6 @@ export declare enum Form1099Type { * @interface FraudAmount */ export interface FraudAmount { - [key: string]: object | unknown; /** * * @type {ISOCurrencyCode} @@ -14884,7 +14627,6 @@ export interface FraudAmount { * @interface GenericScreeningHitLocationItems */ export interface GenericScreeningHitLocationItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -14904,7 +14646,6 @@ export interface GenericScreeningHitLocationItems { * @interface HealthIncident */ export interface HealthIncident { - [key: string]: object | unknown; /** * The start date of the incident, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format, e.g. `\"2020-10-30T15:26:48Z\"`. * @type {string} @@ -14936,7 +14677,6 @@ export interface HealthIncident { * @interface HistoricalBalance */ export interface HistoricalBalance { - [key: string]: object | unknown; /** * The date of the calculated historical balance, in an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD) * @type {string} @@ -14968,7 +14708,6 @@ export interface HistoricalBalance { * @interface HistoricalUpdateWebhook */ export interface HistoricalUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -15012,7 +14751,6 @@ export interface HistoricalUpdateWebhook { * @interface Holding */ export interface Holding { - [key: string]: object | unknown; /** * The Plaid `account_id` associated with the holding. * @type {string} @@ -15080,7 +14818,6 @@ export interface Holding { * @interface HoldingsDefaultUpdateWebhook */ export interface HoldingsDefaultUpdateWebhook { - [key: string]: object | unknown; /** * `HOLDINGS` * @type {string} @@ -15182,7 +14919,6 @@ export declare enum HostedLinkDeliveryMethod { * @interface HostedMMDVerificationWebhook */ export interface HostedMMDVerificationWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -15276,7 +15012,6 @@ export declare enum ISOCurrencyCode { * @interface IdentityDefaultUpdateWebhook */ export interface IdentityDefaultUpdateWebhook { - [key: string]: object | unknown; /** * `IDENTITY` * @type {string} @@ -15341,7 +15076,6 @@ export interface IdentityDocument { * @interface IdentityDocumentMetadata */ export interface IdentityDocumentMetadata { - [key: string]: object | unknown; /** * The name of the document. * @type {string} @@ -15429,7 +15163,6 @@ export interface IdentityGetRequestOptions { * @interface IdentityGetResponse */ export interface IdentityGetResponse { - [key: string]: object | unknown; /** * The accounts for which Identity data has been requested * @type {Array} @@ -15505,7 +15238,6 @@ export interface IdentityMatchRequestOptions { * @interface IdentityMatchResponse */ export interface IdentityMatchResponse { - [key: string]: object | unknown; /** * The accounts for which Identity match has been requested * @type {Array} @@ -15531,7 +15263,6 @@ export interface IdentityMatchResponse { * @interface IdentityMatchUser */ export interface IdentityMatchUser { - [key: string]: object | unknown; /** * The user\'s full legal name. * @type {string} @@ -15588,7 +15319,6 @@ export interface IdentityRefreshRequest { * @interface IdentityRefreshResponse */ export interface IdentityRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -15613,7 +15343,6 @@ export declare enum IdentityUpdateTypes { * @interface IdentityVerification */ export interface IdentityVerification { - [key: string]: object | unknown; /** * ID of the associated Identity Verification attempt. * @type {string} @@ -15717,7 +15446,6 @@ export interface IdentityVerification { * @interface IdentityVerificationAutofillAddress */ export interface IdentityVerificationAutofillAddress { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -15798,7 +15526,6 @@ export interface IdentityVerificationAutofillCreateRequest { * @interface IdentityVerificationAutofillCreateResponse */ export interface IdentityVerificationAutofillCreateResponse { - [key: string]: object | unknown; /** * * @type {IdentityVerificationAutofillStatus} @@ -15833,7 +15560,6 @@ export declare enum IdentityVerificationAutofillStatus { * @interface IdentityVerificationAutofillUserData */ export interface IdentityVerificationAutofillUserData { - [key: string]: object | unknown; /** * * @type {IdentityVerificationResponseUserName} @@ -15964,7 +15690,6 @@ export interface IdentityVerificationCreateRequestUser { * @interface IdentityVerificationCreateResponse */ export interface IdentityVerificationCreateResponse { - [key: string]: object | unknown; /** * ID of the associated Identity Verification attempt. * @type {string} @@ -16074,7 +15799,6 @@ export interface IdentityVerificationCreateResponse { * @interface IdentityVerificationDocumentAddressResponse */ export interface IdentityVerificationDocumentAddressResponse { - [key: string]: object | unknown; /** * The full street address extracted from the document. * @type {string} @@ -16137,7 +15861,6 @@ export interface IdentityVerificationGetRequest { * @interface IdentityVerificationGetResponse */ export interface IdentityVerificationGetResponse { - [key: string]: object | unknown; /** * ID of the associated Identity Verification attempt. * @type {string} @@ -16284,7 +16007,6 @@ export interface IdentityVerificationListRequest { * @interface IdentityVerificationListResponse */ export interface IdentityVerificationListResponse { - [key: string]: object | unknown; /** * List of Plaid sessions * @type {Array} @@ -16310,7 +16032,6 @@ export interface IdentityVerificationListResponse { * @interface IdentityVerificationRequestUser */ export interface IdentityVerificationRequestUser { - [key: string]: object | unknown; /** * A valid email address. * @type {string} @@ -16373,7 +16094,6 @@ export interface IdentityVerificationRequestUserName { * @interface IdentityVerificationResponseUserName */ export interface IdentityVerificationResponseUserName { - [key: string]: object | unknown; /** * A string with at least one non-whitespace character, with a max length of 100 characters. * @type {string} @@ -16393,7 +16113,6 @@ export interface IdentityVerificationResponseUserName { * @interface IdentityVerificationRetriedWebhook */ export interface IdentityVerificationRetriedWebhook { - [key: string]: object | unknown; /** * `IDENTITY_VERIFICATION` * @type {string} @@ -16505,7 +16224,6 @@ export interface IdentityVerificationRetryRequestStepsObject { * @interface IdentityVerificationRetryResponse */ export interface IdentityVerificationRetryResponse { - [key: string]: object | unknown; /** * ID of the associated Identity Verification attempt. * @type {string} @@ -16628,7 +16346,6 @@ export declare enum IdentityVerificationStatus { * @interface IdentityVerificationStatusUpdatedWebhook */ export interface IdentityVerificationStatusUpdatedWebhook { - [key: string]: object | unknown; /** * `IDENTITY_VERIFICATION` * @type {string} @@ -16678,7 +16395,6 @@ export declare enum IdentityVerificationStepStatus { * @interface IdentityVerificationStepSummary */ export interface IdentityVerificationStepSummary { - [key: string]: object | unknown; /** * * @type {IdentityVerificationStepStatus} @@ -16728,7 +16444,6 @@ export interface IdentityVerificationStepSummary { * @interface IdentityVerificationStepUpdatedWebhook */ export interface IdentityVerificationStepUpdatedWebhook { - [key: string]: object | unknown; /** * `IDENTITY_VERIFICATION` * @type {string} @@ -16760,7 +16475,6 @@ export interface IdentityVerificationStepUpdatedWebhook { * @interface IdentityVerificationTemplateReference */ export interface IdentityVerificationTemplateReference { - [key: string]: object | unknown; /** * ID of the associated Identity Verification template. * @type {string} @@ -16780,7 +16494,6 @@ export interface IdentityVerificationTemplateReference { * @interface IdentityVerificationUserAddress */ export interface IdentityVerificationUserAddress { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -16824,7 +16537,6 @@ export interface IdentityVerificationUserAddress { * @interface IdentityVerificationUserData */ export interface IdentityVerificationUserData { - [key: string]: object | unknown; /** * A phone number in E.164 format. * @type {string} @@ -16884,7 +16596,6 @@ export declare enum ImageQuality { * @interface IncidentUpdate */ export interface IncidentUpdate { - [key: string]: object | unknown; /** * The content of the update. * @type {string} @@ -16921,7 +16632,6 @@ export declare enum IncidentUpdateStatusEnum { * @interface IncomeBreakdown */ export interface IncomeBreakdown { - [key: string]: object | unknown; /** * * @type {IncomeBreakdownType} @@ -16977,7 +16687,6 @@ export interface IncomeOverride { * @interface IncomeSummary */ export interface IncomeSummary { - [key: string]: object | unknown; /** * * @type {EmployerIncomeSummaryFieldString} @@ -17027,7 +16736,6 @@ export interface IncomeSummary { * @interface IncomeSummaryFieldNumber */ export interface IncomeSummaryFieldNumber { - [key: string]: object | unknown; /** * The value of the field. * @type {number} @@ -17047,7 +16755,6 @@ export interface IncomeSummaryFieldNumber { * @interface IncomeSummaryFieldString */ export interface IncomeSummaryFieldString { - [key: string]: object | unknown; /** * The value of the field. * @type {string} @@ -17117,7 +16824,6 @@ export interface IncomeVerificationCreateRequestOptions { * @interface IncomeVerificationCreateResponse */ export interface IncomeVerificationCreateResponse { - [key: string]: object | unknown; /** * ID of the verification. This ID is persisted throughout the lifetime of the verification. * @type {string} @@ -17225,7 +16931,6 @@ export interface IncomeVerificationPaystubsGetRequest { * @interface IncomeVerificationPaystubsGetResponse */ export interface IncomeVerificationPaystubsGetResponse { - [key: string]: object | unknown; /** * Metadata for an income document. * @type {Array} @@ -17335,7 +17040,6 @@ export interface IncomeVerificationPrecheckEmployerAddress { * @interface IncomeVerificationPrecheckEmployerAddressData */ export interface IncomeVerificationPrecheckEmployerAddressData { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -17461,7 +17165,6 @@ export interface IncomeVerificationPrecheckRequest { * @interface IncomeVerificationPrecheckResponse */ export interface IncomeVerificationPrecheckResponse { - [key: string]: object | unknown; /** * ID of the precheck. Provide this value when calling `/link/token/create` in order to optimize Link conversion. * @type {string} @@ -17518,7 +17221,6 @@ export interface IncomeVerificationPrecheckUser { * @interface IncomeVerificationRefreshReconnectNeededWebhook */ export interface IncomeVerificationRefreshReconnectNeededWebhook { - [key: string]: object | unknown; /** * `INCOME` * @type {string} @@ -17550,7 +17252,6 @@ export interface IncomeVerificationRefreshReconnectNeededWebhook { * @interface IncomeVerificationRiskSignalsStatusWebhook */ export interface IncomeVerificationRiskSignalsStatusWebhook { - [key: string]: object | unknown; /** * `\"INCOME\"` * @type {string} @@ -17603,7 +17304,6 @@ export declare enum IncomeVerificationSourceType { * @interface IncomeVerificationStatusWebhook */ export interface IncomeVerificationStatusWebhook { - [key: string]: object | unknown; /** * `\"INCOME\"` * @type {string} @@ -17679,7 +17379,6 @@ export interface IncomeVerificationTaxformsGetRequest { * @interface IncomeVerificationTaxformsGetResponse */ export interface IncomeVerificationTaxformsGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -17711,7 +17410,6 @@ export interface IncomeVerificationTaxformsGetResponse { * @interface IncomeVerificationWebhookStatus */ export interface IncomeVerificationWebhookStatus { - [key: string]: object | unknown; /** * * @type {string} @@ -17725,7 +17423,6 @@ export interface IncomeVerificationWebhookStatus { * @interface IndividualName */ export interface IndividualName { - [key: string]: object | unknown; /** * The first name of the individual represented by the parent object. * @type {string} @@ -17745,7 +17442,6 @@ export interface IndividualName { * @interface IndividualScreeningHitNames */ export interface IndividualScreeningHitNames { - [key: string]: object | unknown; /** * The full name of the individual, including all parts. * @type {string} @@ -17802,7 +17498,6 @@ export declare enum IndividualWatchlistCode { * @interface IndividualWatchlistProgram */ export interface IndividualWatchlistProgram { - [key: string]: object | unknown; /** * ID of the associated program. * @type {string} @@ -17858,7 +17553,6 @@ export interface IndividualWatchlistProgram { * @interface InflowModel */ export interface InflowModel { - [key: string]: object | unknown; /** * Inflow model. One of the following: `none`: No income `monthly-income`: Income occurs once per month `monthly-balance-payment`: Pays off the balance on a liability account at the given statement day of month. `monthly-interest-only-payment`: Makes an interest-only payment on a liability account at the given statement day of month. Note that account types supported by Liabilities will accrue interest in the Sandbox. The types impacted are account type `credit` with subtype `credit` or `paypal`, and account type `loan` with subtype `student` or `mortgage`. * @type {string} @@ -17896,7 +17590,6 @@ export interface InflowModel { * @interface InitialUpdateWebhook */ export interface InitialUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -17940,7 +17633,6 @@ export interface InitialUpdateWebhook { * @interface Institution */ export interface Institution { - [key: string]: object | unknown; /** * Unique identifier for the institution. Note that the same institution may have multiple records, each with different institution IDs; for example, if the institution has migrated to OAuth, there may be separate `institution_id`s for the OAuth and non-OAuth versions of the institution. Institutions that operate in different countries or with multiple login portals may also have separate `institution_id`s for each country or portal. * @type {string} @@ -18026,7 +17718,6 @@ export interface Institution { * @interface InstitutionStatus */ export interface InstitutionStatus { - [key: string]: object | unknown; /** * * @type {ProductStatus} @@ -18088,7 +17779,6 @@ export interface InstitutionStatus { * @interface InstitutionStatusAlertWebhook */ export interface InstitutionStatusAlertWebhook { - [key: string]: object | unknown; /** * `DASHBOARD_CONFIGURED_ALERT` * @type {string} @@ -18126,7 +17816,6 @@ export interface InstitutionStatusAlertWebhook { * @interface InstitutionSupportedNetworks */ export interface InstitutionSupportedNetworks { - [key: string]: object | unknown; /** * * @type {TransferCapabilitiesGetRTP} @@ -18208,7 +17897,6 @@ export interface InstitutionsGetByIdRequestOptions { * @interface InstitutionsGetByIdResponse */ export interface InstitutionsGetByIdResponse { - [key: string]: object | unknown; /** * * @type {Institution} @@ -18314,7 +18002,6 @@ export interface InstitutionsGetRequestOptions { * @interface InstitutionsGetResponse */ export interface InstitutionsGetResponse { - [key: string]: object | unknown; /** * A list of Plaid institutions * @type {Array} @@ -18340,7 +18027,6 @@ export interface InstitutionsGetResponse { * @interface InstitutionsSearchAccountFilter */ export interface InstitutionsSearchAccountFilter { - [key: string]: object | unknown; /** * * @type {Array} @@ -18471,7 +18157,6 @@ export interface InstitutionsSearchRequestOptions { * @interface InstitutionsSearchResponse */ export interface InstitutionsSearchResponse { - [key: string]: object | unknown; /** * An array of institutions matching the search criteria * @type {Array} @@ -18548,7 +18233,6 @@ export declare enum InvestmentAccountSubtype { * @interface InvestmentFilter */ export interface InvestmentFilter { - [key: string]: object | unknown; /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -18575,7 +18259,6 @@ export interface InvestmentHoldingsGetRequestOptions { * @interface InvestmentTransaction */ export interface InvestmentTransaction { - [key: string]: object | unknown; /** * The ID of the Investment transaction, unique across all Plaid transactions. Like all Plaid identifiers, the `investment_transaction_id` is case sensitive. * @type {string} @@ -18736,7 +18419,6 @@ export declare enum InvestmentTransactionType { * @interface InvestmentsAuthGetNumbers */ export interface InvestmentsAuthGetNumbers { - [key: string]: object | unknown; /** * * @type {Array} @@ -18800,7 +18482,6 @@ export interface InvestmentsAuthGetRequestOptions { * @interface InvestmentsAuthGetResponse */ export interface InvestmentsAuthGetResponse { - [key: string]: object | unknown; /** * The accounts for which data is being retrieved * @type {Array} @@ -18850,7 +18531,6 @@ export interface InvestmentsAuthGetResponse { * @interface InvestmentsAuthOwner */ export interface InvestmentsAuthOwner { - [key: string]: object | unknown; /** * The ID of the account that this identity information pertains to * @type {string} @@ -18870,7 +18550,6 @@ export interface InvestmentsAuthOwner { * @interface InvestmentsDefaultUpdateWebhook */ export interface InvestmentsDefaultUpdateWebhook { - [key: string]: object | unknown; /** * `INVESTMENTS_TRANSACTIONS` * @type {string} @@ -18920,7 +18599,6 @@ export interface InvestmentsDefaultUpdateWebhook { * @interface InvestmentsHistoricalUpdateWebhook */ export interface InvestmentsHistoricalUpdateWebhook { - [key: string]: object | unknown; /** * `INVESTMENTS_TRANSACTIONS` * @type {string} @@ -19001,7 +18679,6 @@ export interface InvestmentsHoldingsGetRequest { * @interface InvestmentsHoldingsGetResponse */ export interface InvestmentsHoldingsGetResponse { - [key: string]: object | unknown; /** * The accounts associated with the Item * @type {Array} @@ -19070,7 +18747,6 @@ export interface InvestmentsRefreshRequest { * @interface InvestmentsRefreshResponse */ export interface InvestmentsRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -19158,7 +18834,6 @@ export interface InvestmentsTransactionsGetRequestOptions { * @interface InvestmentsTransactionsGetResponse */ export interface InvestmentsTransactionsGetResponse { - [key: string]: object | unknown; /** * * @type {Item} @@ -19272,7 +18947,6 @@ export declare enum IssuingCountry { * @interface Item */ export interface Item { - [key: string]: object | unknown; /** * The Plaid Item ID. The `item_id` is always unique; linking the same account at the same institution twice will result in two Items with different `item_id` values. Like all Plaid identifiers, the `item_id` is case-sensitive. * @type {string} @@ -19373,7 +19047,6 @@ export interface ItemAccessTokenInvalidateRequest { * @interface ItemAccessTokenInvalidateResponse */ export interface ItemAccessTokenInvalidateResponse { - [key: string]: object | unknown; /** * The access token associated with the Item data is being requested for. * @type {string} @@ -19430,7 +19103,6 @@ export interface ItemActivityListRequest { * @interface ItemActivityListResponse */ export interface ItemActivityListResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -19487,7 +19159,6 @@ export interface ItemApplicationListRequest { * @interface ItemApplicationListResponse */ export interface ItemApplicationListResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -19575,7 +19246,6 @@ export interface ItemApplicationScopesUpdateRequest { * @interface ItemApplicationScopesUpdateResponse */ export interface ItemApplicationScopesUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -19620,7 +19290,6 @@ export interface ItemApplicationUnlinkRequest { * @interface ItemApplicationUnlinkResponse */ export interface ItemApplicationUnlinkResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -19634,7 +19303,6 @@ export interface ItemApplicationUnlinkResponse { * @interface ItemErrorWebhook */ export interface ItemErrorWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -19697,7 +19365,6 @@ export interface ItemGetRequest { * @interface ItemGetResponse */ export interface ItemGetResponse { - [key: string]: object | unknown; /** * * @type {Item} @@ -19792,7 +19459,6 @@ export interface ItemImportRequestUserAuth { * @interface ItemImportResponse */ export interface ItemImportResponse { - [key: string]: object | unknown; /** * The access token associated with the Item data is being requested for. * @type {string} @@ -19812,7 +19478,6 @@ export interface ItemImportResponse { * @interface ItemLoginRepairedWebhook */ export interface ItemLoginRepairedWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -19844,7 +19509,6 @@ export interface ItemLoginRepairedWebhook { * @interface ItemProductReadyWebhook */ export interface ItemProductReadyWebhook { - [key: string]: object | unknown; /** * `INCOME` * @type {string} @@ -19907,7 +19571,6 @@ export interface ItemPublicTokenCreateRequest { * @interface ItemPublicTokenCreateResponse */ export interface ItemPublicTokenCreateResponse { - [key: string]: object | unknown; /** * A `public_token` for the particular Item corresponding to the specified `access_token` * @type {string} @@ -19958,7 +19621,6 @@ export interface ItemPublicTokenExchangeRequest { * @interface ItemPublicTokenExchangeResponse */ export interface ItemPublicTokenExchangeResponse { - [key: string]: object | unknown; /** * The access token associated with the Item data is being requested for. * @type {string} @@ -20009,7 +19671,6 @@ export interface ItemRemoveRequest { * @interface ItemRemoveResponse */ export interface ItemRemoveResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -20023,7 +19684,6 @@ export interface ItemRemoveResponse { * @interface ItemStatus */ export interface ItemStatus { - [key: string]: object | unknown; /** * * @type {ItemStatusInvestments} @@ -20049,7 +19709,6 @@ export interface ItemStatus { * @interface ItemStatusInvestments */ export interface ItemStatusInvestments { - [key: string]: object | unknown; /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of the last successful investments update for the Item. The status will update each time Plaid successfully connects with the institution, regardless of whether any new data is available in the update. * @type {string} @@ -20069,7 +19728,6 @@ export interface ItemStatusInvestments { * @interface ItemStatusLastWebhook */ export interface ItemStatusLastWebhook { - [key: string]: object | unknown; /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of when the webhook was fired. * @type {string} @@ -20114,7 +19772,6 @@ export interface ItemStatusNullable { * @interface ItemStatusTransactions */ export interface ItemStatusTransactions { - [key: string]: object | unknown; /** * [ISO 8601](https://wikipedia.org/wiki/ISO_8601) timestamp of the last successful transactions update for the Item. The status will update each time Plaid successfully connects with the institution, regardless of whether any new data is available in the update. * @type {string} @@ -20165,7 +19822,6 @@ export interface ItemWebhookUpdateRequest { * @interface ItemWebhookUpdateResponse */ export interface ItemWebhookUpdateResponse { - [key: string]: object | unknown; /** * * @type {Item} @@ -20185,7 +19841,6 @@ export interface ItemWebhookUpdateResponse { * @interface JWKPublicKey */ export interface JWKPublicKey { - [key: string]: object | unknown; /** * The alg member identifies the cryptographic algorithm family used with the key. * @type {string} @@ -20247,7 +19902,6 @@ export interface JWKPublicKey { * @interface JWTHeader */ export interface JWTHeader { - [key: string]: object | unknown; /** * * @type {string} @@ -20261,7 +19915,6 @@ export interface JWTHeader { * @interface KYCCheckAddressSummary */ export interface KYCCheckAddressSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -20287,7 +19940,6 @@ export interface KYCCheckAddressSummary { * @interface KYCCheckDateOfBirthSummary */ export interface KYCCheckDateOfBirthSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -20301,7 +19953,6 @@ export interface KYCCheckDateOfBirthSummary { * @interface KYCCheckDetails */ export interface KYCCheckDetails { - [key: string]: object | unknown; /** * The outcome status for the associated Identity Verification attempt\'s `kyc_check` step. This field will always have the same value as `steps.kyc_check`. * @type {string} @@ -20345,7 +19996,6 @@ export interface KYCCheckDetails { * @interface KYCCheckIDNumberSummary */ export interface KYCCheckIDNumberSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -20359,7 +20009,6 @@ export interface KYCCheckIDNumberSummary { * @interface KYCCheckNameSummary */ export interface KYCCheckNameSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -20373,7 +20022,6 @@ export interface KYCCheckNameSummary { * @interface KYCCheckPhoneSummary */ export interface KYCCheckPhoneSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -20393,7 +20041,6 @@ export interface KYCCheckPhoneSummary { * @interface LastDataAccessTimes */ export interface LastDataAccessTimes { - [key: string]: object | unknown; /** * ID of the application accessing data. * @type {string} @@ -20550,7 +20197,6 @@ export interface LiabilitiesGetRequestOptions { * @interface LiabilitiesGetResponse */ export interface LiabilitiesGetResponse { - [key: string]: object | unknown; /** * An array of accounts associated with the Item * @type {Array} @@ -20582,7 +20228,6 @@ export interface LiabilitiesGetResponse { * @interface LiabilitiesObject */ export interface LiabilitiesObject { - [key: string]: object | unknown; /** * The credit accounts returned. * @type {Array} @@ -20608,7 +20253,6 @@ export interface LiabilitiesObject { * @interface LiabilityOverride */ export interface LiabilityOverride { - [key: string]: object | unknown; /** * The type of the liability object, either `credit` or `student`. Mortgages are not currently supported in the custom Sandbox. * @type {string} @@ -20760,7 +20404,6 @@ export interface LiabilityOverride { * @interface LinkCallbackMetadata */ export interface LinkCallbackMetadata { - [key: string]: object | unknown; /** * * @type {LinkDeliveryWebhookCallbackType} @@ -20810,7 +20453,6 @@ export interface LinkCallbackMetadata { * @interface LinkDeliveryAccount */ export interface LinkDeliveryAccount { - [key: string]: object | unknown; /** * The Plaid `account_id` * @type {string} @@ -20860,7 +20502,6 @@ export interface LinkDeliveryAccount { * @interface LinkDeliveryCallbackWebhook */ export interface LinkDeliveryCallbackWebhook { - [key: string]: object | unknown; /** * `LINK_DELIVERY` * @type {string} @@ -20954,7 +20595,6 @@ export interface LinkDeliveryCreateRequest { * @interface LinkDeliveryCreateResponse */ export interface LinkDeliveryCreateResponse { - [key: string]: object | unknown; /** * The URL to the Hosted Link session, which will be delivered by the specified delivery method. * @type {string} @@ -21014,7 +20654,6 @@ export interface LinkDeliveryGetRequest { * @interface LinkDeliveryGetResponse */ export interface LinkDeliveryGetResponse { - [key: string]: object | unknown; /** * * @type {LinkDeliverySessionStatus} @@ -21058,7 +20697,6 @@ export interface LinkDeliveryGetResponse { * @interface LinkDeliveryInstitution */ export interface LinkDeliveryInstitution { - [key: string]: object | unknown; /** * The full institution name, such as \'Wells Fargo\' * @type {string} @@ -21078,7 +20716,6 @@ export interface LinkDeliveryInstitution { * @interface LinkDeliveryMetadata */ export interface LinkDeliveryMetadata { - [key: string]: object | unknown; /** * * @type {LinkDeliveryWebhookCommunicationMethod} @@ -21184,7 +20821,6 @@ export declare enum LinkDeliveryWebhookDeliveryStatus { * @interface LinkEvent */ export interface LinkEvent { - [key: string]: object | unknown; /** * Event name * @type {string} @@ -21210,7 +20846,6 @@ export interface LinkEvent { * @interface LinkEventMetadata */ export interface LinkEventMetadata { - [key: string]: object | unknown; /** * The error code that the user encountered. Emitted by `ERROR`, `EXIT`. * @type {string} @@ -21340,7 +20975,6 @@ export declare enum LinkEventName { * @interface LinkEventsWebhook */ export interface LinkEventsWebhook { - [key: string]: object | unknown; /** * `LINK` * @type {string} @@ -21403,7 +21037,6 @@ export interface LinkOAuthCorrelationIdExchangeRequest { * @interface LinkOAuthCorrelationIdExchangeResponse */ export interface LinkOAuthCorrelationIdExchangeResponse { - [key: string]: object | unknown; /** * The `link_token` associated to the given `link_correlation_id`, which can be used to re-initialize Link. * @type {string} @@ -21423,7 +21056,6 @@ export interface LinkOAuthCorrelationIdExchangeResponse { * @interface LinkSessionExit */ export interface LinkSessionExit { - [key: string]: object | unknown; /** * * @type {PlaidError} @@ -21493,7 +21125,6 @@ export interface LinkSessionExitMetadataInstitution { * @interface LinkSessionFinishedWebhook */ export interface LinkSessionFinishedWebhook { - [key: string]: object | unknown; /** * `LINK` * @type {string} @@ -21670,7 +21301,6 @@ export declare enum LinkSessionSuccessMetadataTransferStatus { * @interface LinkTokenAccountFilters */ export interface LinkTokenAccountFilters { - [key: string]: object | unknown; /** * * @type {DepositoryFilter} @@ -21747,7 +21377,6 @@ export interface LinkTokenCreateDepositoryFilter { * @interface LinkTokenCreateHostedLink */ export interface LinkTokenCreateHostedLink { - [key: string]: object | unknown; /** * * @type {HostedLinkDeliveryMethod} @@ -22410,7 +22039,7 @@ export interface LinkTokenCreateRequestUser { */ client_user_id: string; /** - * The user\'s full legal name, used for [micro-deposit based verification flows](https://plaid.com/docs/auth/coverage/). For a small number of customers on legacy flows, providing this field is required to enable micro-deposit-based flows. For all other customers, this field is optional, but providing the user\'s name in this field when using micro-deposit-based verification will enable certain risk checks and can reduce micro-deposit fraud. + * The user\'s full legal name, used for [micro-deposit based verification flows](https://plaid.com/docs/auth/coverage/). For a small number of customers on legacy flows, providing this field is required to enable micro-deposit-based flows. For all other customers, this field is optional. Providing the user\'s name in this field when using micro-deposit-based verification will streamline the end user experience, as the user will not be prompted to enter their name during the Link flow; Plaid will use the provided legal name instead. * @type {string} * @memberof LinkTokenCreateRequestUser */ @@ -22522,7 +22151,6 @@ export interface LinkTokenCreateRequestUserStatedIncomeSource { * @interface LinkTokenCreateResponse */ export interface LinkTokenCreateResponse { - [key: string]: object | unknown; /** * A `link_token`, which can be supplied to Link in order to initialize it and receive a `public_token`, which can be exchanged for an `access_token`. * @type {string} @@ -22567,7 +22195,6 @@ export interface LinkTokenEUConfig { * @interface LinkTokenGetMetadataResponse */ export interface LinkTokenGetMetadataResponse { - [key: string]: object | unknown; /** * The `products` specified in the `/link/token/create` call. * @type {Array} @@ -22648,7 +22275,6 @@ export interface LinkTokenGetRequest { * @interface LinkTokenGetResponse */ export interface LinkTokenGetResponse { - [key: string]: object | unknown; /** * A `link_token`, which can be supplied to Link in order to initialize it and receive a `public_token`, which can be exchanged for an `access_token`. * @type {string} @@ -22692,7 +22318,6 @@ export interface LinkTokenGetResponse { * @interface LinkTokenGetSessionsResponse */ export interface LinkTokenGetSessionsResponse { - [key: string]: object | unknown; /** * The unique ID for the link session. * @type {string} @@ -22781,7 +22406,6 @@ export interface LinkTokenTransactions { * @interface LinkUserDeliveryStatusWebhook */ export interface LinkUserDeliveryStatusWebhook { - [key: string]: object | unknown; /** * `LINK_DELIVERY` * @type {string} @@ -22819,7 +22443,6 @@ export interface LinkUserDeliveryStatusWebhook { * @interface Loan */ export interface Loan { - [key: string]: object | unknown; /** * * @type {LoanIdentifiers} @@ -22852,7 +22475,6 @@ export declare enum LoanAccountSubtype { * @interface LoanFilter */ export interface LoanFilter { - [key: string]: object | unknown; /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -22866,7 +22488,6 @@ export interface LoanFilter { * @interface LoanIdentifier */ export interface LoanIdentifier { - [key: string]: object | unknown; /** * The value of the identifier for the specified type. * @type {string} @@ -22895,7 +22516,6 @@ export declare enum LoanIdentifierType { * @interface LoanIdentifiers */ export interface LoanIdentifiers { - [key: string]: object | unknown; /** * * @type {LoanIdentifier} @@ -22909,7 +22529,6 @@ export interface LoanIdentifiers { * @interface Loans */ export interface Loans { - [key: string]: object | unknown; /** * * @type {Loan} @@ -22923,7 +22542,6 @@ export interface Loans { * @interface Location */ export interface Location { - [key: string]: object | unknown; /** * The street address where the transaction occurred. * @type {string} @@ -22979,7 +22597,6 @@ export interface Location { * @interface MFA */ export interface MFA { - [key: string]: object | unknown; /** * Possible values are `device`, `selections`, or `questions`. If value is `device`, the MFA answer is `1234`. If value is `selections`, the MFA answer is always the first option. If value is `questions`, the MFA answer is `answer__` for the j-th question in the i-th round, starting from 0. For example, the answer to the first question in the second round is `answer_1_0`. * @type {string} @@ -23017,7 +22634,6 @@ export interface MFA { * @interface MatchSummary */ export interface MatchSummary { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -23098,7 +22714,6 @@ export interface MerchantInsights { * @interface Meta */ export interface Meta { - [key: string]: object | unknown; /** * The account\'s name * @type {string} @@ -23130,7 +22745,6 @@ export interface Meta { * @interface MortgageInterestRate */ export interface MortgageInterestRate { - [key: string]: object | unknown; /** * Percentage value (interest rate of current mortgage, not APR) of interest payable on a loan. * @type {number} @@ -23150,7 +22764,6 @@ export interface MortgageInterestRate { * @interface MortgageLiability */ export interface MortgageLiability { - [key: string]: object | unknown; /** * The ID of the account that this liability belongs to. * @type {string} @@ -23278,7 +22891,6 @@ export interface MortgageLiability { * @interface MortgagePropertyAddress */ export interface MortgagePropertyAddress { - [key: string]: object | unknown; /** * The city name. * @type {string} @@ -23316,7 +22928,6 @@ export interface MortgagePropertyAddress { * @interface MultiDocumentRiskSignal */ export interface MultiDocumentRiskSignal { - [key: string]: object | unknown; /** * Array of objects containing attributes that could indicate if a document is fraudulent * @type {Array} @@ -23336,7 +22947,6 @@ export interface MultiDocumentRiskSignal { * @interface NameMatchScore */ export interface NameMatchScore { - [key: string]: object | unknown; /** * Match score for name. 100 is a perfect score, 99-85 means a strong match, 84-70 is a partial match, any score less than 70 is a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the name is missing from either the API or financial institution, this is null. * @type {number} @@ -23369,7 +22979,6 @@ export interface NameMatchScore { * @interface NetPay */ export interface NetPay { - [key: string]: object | unknown; /** * Raw amount of the net pay for the pay period * @type {number} @@ -23451,7 +23060,6 @@ export interface NewAccountsAvailableWebhook { * @interface Numbers */ export interface Numbers { - [key: string]: object | unknown; /** * Will be used for the account number. * @type {string} @@ -23507,7 +23115,6 @@ export interface Numbers { * @interface NumbersACATS */ export interface NumbersACATS { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23533,7 +23140,6 @@ export interface NumbersACATS { * @interface NumbersACH */ export interface NumbersACH { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23620,7 +23226,6 @@ export interface NumbersACHNullable { * @interface NumbersATON */ export interface NumbersATON { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23640,7 +23245,6 @@ export interface NumbersATON { * @interface NumbersBACS */ export interface NumbersBACS { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23691,7 +23295,6 @@ export interface NumbersBACSNullable { * @interface NumbersEFT */ export interface NumbersEFT { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23761,7 +23364,6 @@ export interface NumbersIBANNullable { * @interface NumbersInternational */ export interface NumbersInternational { - [key: string]: object | unknown; /** * The Plaid account ID associated with the account numbers * @type {string} @@ -23787,7 +23389,6 @@ export interface NumbersInternational { * @interface NumbersInternationalIBAN */ export interface NumbersInternationalIBAN { - [key: string]: object | unknown; /** * International Bank Account Number (IBAN). * @type {string} @@ -23841,7 +23442,6 @@ export declare enum OmittableTransferType { * @interface OptionContract */ export interface OptionContract { - [key: string]: object | unknown; /** * The type of this option contract. It is one of: `put`: for Put option contracts `call`: for Call option contracts * @type {string} @@ -23873,7 +23473,6 @@ export interface OptionContract { * @interface Originator */ export interface Originator { - [key: string]: object | unknown; /** * Originator’s client ID. * @type {string} @@ -23913,7 +23512,6 @@ export declare enum OtherAccountSubtype { * @interface OtherFilter */ export interface OtherFilter { - [key: string]: object | unknown; /** * An array of account subtypes to display in Link. If not specified, all account subtypes will be shown. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {Array} @@ -23940,7 +23538,6 @@ export declare enum OverrideAccountType { * @interface OverrideAccounts */ export interface OverrideAccounts { - [key: string]: object | unknown; /** * * @type {OverrideAccountType} @@ -24032,7 +23629,6 @@ export interface OverrideAccounts { * @interface Owner */ export interface Owner { - [key: string]: object | unknown; /** * A list of names associated with the account by the financial institution. In the case of a joint account, Plaid will make a best effort to report the names of all account holders. If an Item contains multiple accounts with different owner names, some institutions will report all names associated with the Item in each account\'s `names` array. * @type {Array} @@ -24070,7 +23666,6 @@ export interface Owner { * @interface OwnerOverride */ export interface OwnerOverride { - [key: string]: object | unknown; /** * A list of names associated with the account by the financial institution. These should always be the names of individuals, even for business accounts. Note that the same name data will be used for all accounts associated with an Item. * @type {Array} @@ -24124,7 +23719,6 @@ export declare enum POBoxStatus { * @interface PSLFStatus */ export interface PSLFStatus { - [key: string]: object | unknown; /** * The estimated date borrower will have completed 120 qualifying monthly payments. Returned in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD). * @type {string} @@ -24150,7 +23744,6 @@ export interface PSLFStatus { * @interface Parties */ export interface Parties { - [key: string]: object | unknown; /** * * @type {Array} @@ -24279,7 +23872,6 @@ export interface PartnerCustomerCreateRequest { * @interface PartnerCustomerCreateResponse */ export interface PartnerCustomerCreateResponse { - [key: string]: object | unknown; /** * * @type {PartnerEndCustomerWithSecrets} @@ -24324,7 +23916,6 @@ export interface PartnerCustomerEnableRequest { * @interface PartnerCustomerEnableResponse */ export interface PartnerCustomerEnableResponse { - [key: string]: object | unknown; /** * The end customer\'s secret key for the Production environment. * @type {string} @@ -24369,7 +23960,6 @@ export interface PartnerCustomerGetRequest { * @interface PartnerCustomerGetResponse */ export interface PartnerCustomerGetResponse { - [key: string]: object | unknown; /** * * @type {PartnerEndCustomer} @@ -24414,7 +24004,6 @@ export interface PartnerCustomerOAuthInstitutionsGetRequest { * @interface PartnerCustomerOAuthInstitutionsGetResponse */ export interface PartnerCustomerOAuthInstitutionsGetResponse { - [key: string]: object | unknown; /** * * @type {PartnerEndCustomerFlowdownStatus} @@ -24471,7 +24060,6 @@ export interface PartnerCustomerRemoveRequest { * @interface PartnerCustomerRemoveResponse */ export interface PartnerCustomerRemoveResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -24485,7 +24073,6 @@ export interface PartnerCustomerRemoveResponse { * @interface PartnerEndCustomer */ export interface PartnerEndCustomer { - [key: string]: object | unknown; /** * The `client_id` of the end customer. * @type {string} @@ -24511,7 +24098,6 @@ export interface PartnerEndCustomer { * @interface PartnerEndCustomerAddress */ export interface PartnerEndCustomerAddress { - [key: string]: object | unknown; /** * * @type {string} @@ -24549,7 +24135,6 @@ export interface PartnerEndCustomerAddress { * @interface PartnerEndCustomerAssetsUnderManagement */ export interface PartnerEndCustomerAssetsUnderManagement { - [key: string]: object | unknown; /** * * @type {number} @@ -24569,7 +24154,6 @@ export interface PartnerEndCustomerAssetsUnderManagement { * @interface PartnerEndCustomerBillingContact */ export interface PartnerEndCustomerBillingContact { - [key: string]: object | unknown; /** * * @type {string} @@ -24595,7 +24179,6 @@ export interface PartnerEndCustomerBillingContact { * @interface PartnerEndCustomerCustomerSupportInfo */ export interface PartnerEndCustomerCustomerSupportInfo { - [key: string]: object | unknown; /** * * @type {string} @@ -24638,7 +24221,6 @@ export declare enum PartnerEndCustomerFlowdownStatus { * @interface PartnerEndCustomerOAuthInstitution */ export interface PartnerEndCustomerOAuthInstitution { - [key: string]: object | unknown; /** * * @type {string} @@ -24688,7 +24270,6 @@ export declare enum PartnerEndCustomerOAuthInstitutionApplicationStatus { * @interface PartnerEndCustomerOAuthInstitutionEnvironments */ export interface PartnerEndCustomerOAuthInstitutionEnvironments { - [key: string]: object | unknown; /** * * @type {PartnerEndCustomerOAuthInstitutionApplicationStatus} @@ -24779,7 +24360,6 @@ export declare enum PartnerEndCustomerQuestionnaireStatus { * @interface PartnerEndCustomerSecrets */ export interface PartnerEndCustomerSecrets { - [key: string]: object | unknown; /** * The end customer\'s secret key for the Sandbox environment. * @type {string} @@ -24810,7 +24390,6 @@ export declare enum PartnerEndCustomerStatus { * @interface PartnerEndCustomerTechnicalContact */ export interface PartnerEndCustomerTechnicalContact { - [key: string]: object | unknown; /** * * @type {string} @@ -24880,7 +24459,6 @@ export interface PartnerEndCustomerWithSecretsAllOf { * @interface Party */ export interface Party { - [key: string]: object | unknown; /** * * @type {PartyIndividual} @@ -24906,7 +24484,6 @@ export interface Party { * @interface PartyIndividual */ export interface PartyIndividual { - [key: string]: object | unknown; /** * * @type {IndividualName} @@ -24928,7 +24505,6 @@ export declare enum PartyRoleType { * @interface Pay */ export interface Pay { - [key: string]: object | unknown; /** * A numerical amount of a specific currency. * @type {number} @@ -24948,7 +24524,6 @@ export interface Pay { * @interface PayFrequency */ export interface PayFrequency { - [key: string]: object | unknown; /** * * @type {PayFrequencyValue} @@ -24981,7 +24556,6 @@ export declare enum PayFrequencyValue { * @interface PayPeriodDetails */ export interface PayPeriodDetails { - [key: string]: object | unknown; /** * The amount of the paycheck. * @type {number} @@ -25051,7 +24625,6 @@ export declare enum PayPeriodDetailsPayFrequency { * @interface PayStubDeductionsBreakdown */ export interface PayStubDeductionsBreakdown { - [key: string]: object | unknown; /** * Raw amount of the deduction * @type {number} @@ -25089,7 +24662,6 @@ export interface PayStubDeductionsBreakdown { * @interface PayStubDeductionsTotal */ export interface PayStubDeductionsTotal { - [key: string]: object | unknown; /** * Raw amount of the deduction * @type {number} @@ -25121,7 +24693,6 @@ export interface PayStubDeductionsTotal { * @interface PayStubDistributionBreakdown */ export interface PayStubDistributionBreakdown { - [key: string]: object | unknown; /** * Name of the account for the given distribution. * @type {string} @@ -25171,7 +24742,6 @@ export interface PayStubDistributionBreakdown { * @interface PayStubEarningsBreakdown */ export interface PayStubEarningsBreakdown { - [key: string]: object | unknown; /** * Commonly used term to describe the earning line item. * @type {string} @@ -25227,7 +24797,6 @@ export interface PayStubEarningsBreakdown { * @interface PayStubEarningsTotal */ export interface PayStubEarningsTotal { - [key: string]: object | unknown; /** * Total amount of the earnings for this pay period. * @type {number} @@ -25265,7 +24834,6 @@ export interface PayStubEarningsTotal { * @interface PayStubPayPeriodDetails */ export interface PayStubPayPeriodDetails { - [key: string]: object | unknown; /** * The amount of the paycheck. * @type {number} @@ -25333,7 +24901,6 @@ export interface PayStubPayPeriodDetails { * @interface PayStubTaxpayerID */ export interface PayStubTaxpayerID { - [key: string]: object | unknown; /** * Type of ID, e.g. \'SSN\'. * @type {string} @@ -25385,7 +24952,6 @@ export declare enum PaymentAmountCurrency { * @interface PaymentAmountNullable */ export interface PaymentAmountNullable { - [key: string]: object | unknown; /** * * @type {PaymentAmountCurrency} @@ -25555,7 +25121,6 @@ export interface PaymentConsentValidDateTime { * @interface PaymentInitiationAddress */ export interface PaymentInitiationAddress { - [key: string]: object | unknown; /** * An array of length 1-2 representing the street address where the recipient is located. Maximum of 70 characters. * @type {Array} @@ -25587,7 +25152,6 @@ export interface PaymentInitiationAddress { * @interface PaymentInitiationConsent */ export interface PaymentInitiationConsent { - [key: string]: object | unknown; /** * The consent ID. * @type {string} @@ -25711,7 +25275,6 @@ export interface PaymentInitiationConsentCreateRequest { * @interface PaymentInitiationConsentCreateResponse */ export interface PaymentInitiationConsentCreateResponse { - [key: string]: object | unknown; /** * A unique ID identifying the payment consent. * @type {string} @@ -25854,7 +25417,6 @@ export interface PaymentInitiationConsentPaymentExecuteRequest { * @interface PaymentInitiationConsentPaymentExecuteResponse */ export interface PaymentInitiationConsentPaymentExecuteResponse { - [key: string]: object | unknown; /** * A unique ID identifying the payment * @type {string} @@ -25905,7 +25467,6 @@ export interface PaymentInitiationConsentRevokeRequest { * @interface PaymentInitiationConsentRevokeResponse */ export interface PaymentInitiationConsentRevokeResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -25940,7 +25501,6 @@ export declare enum PaymentInitiationConsentStatus { * @interface PaymentInitiationMetadata */ export interface PaymentInitiationMetadata { - [key: string]: object | unknown; /** * Indicates whether the institution supports payments from a different country. * @type {boolean} @@ -25999,7 +25559,6 @@ export interface PaymentInitiationOptionalRestrictionBacs { * @interface PaymentInitiationPayment */ export interface PaymentInitiationPayment { - [key: string]: object | unknown; /** * The ID of the payment. Like all Plaid identifiers, the `payment_id` is case sensitive. * @type {string} @@ -26164,7 +25723,6 @@ export interface PaymentInitiationPaymentCreateRequest { * @interface PaymentInitiationPaymentCreateResponse */ export interface PaymentInitiationPaymentCreateResponse { - [key: string]: object | unknown; /** * A unique ID identifying the payment * @type {string} @@ -26381,7 +25939,6 @@ export interface PaymentInitiationPaymentListRequest { * @interface PaymentInitiationPaymentListResponse */ export interface PaymentInitiationPaymentListResponse { - [key: string]: object | unknown; /** * An array of payments that have been created, associated with the given `client_id`. * @type {Array} @@ -26450,7 +26007,6 @@ export interface PaymentInitiationPaymentReverseRequest { * @interface PaymentInitiationPaymentReverseResponse */ export interface PaymentInitiationPaymentReverseResponse { - [key: string]: object | unknown; /** * A unique ID identifying the refund * @type {string} @@ -26522,7 +26078,6 @@ export interface PaymentInitiationPaymentTokenCreateRequest { * @interface PaymentInitiationPaymentTokenCreateResponse */ export interface PaymentInitiationPaymentTokenCreateResponse { - [key: string]: object | unknown; /** * A `payment_token` that can be provided to Link initialization to enter the payment initiation flow * @type {string} @@ -26548,7 +26103,6 @@ export interface PaymentInitiationPaymentTokenCreateResponse { * @interface PaymentInitiationRecipient */ export interface PaymentInitiationRecipient { - [key: string]: object | unknown; /** * The ID of the recipient. * @type {string} @@ -26629,7 +26183,6 @@ export interface PaymentInitiationRecipientCreateRequest { * @interface PaymentInitiationRecipientCreateResponse */ export interface PaymentInitiationRecipientCreateResponse { - [key: string]: object | unknown; /** * A unique ID identifying the recipient * @type {string} @@ -26749,7 +26302,6 @@ export interface PaymentInitiationRecipientListRequest { * @interface PaymentInitiationRecipientListResponse */ export interface PaymentInitiationRecipientListResponse { - [key: string]: object | unknown; /** * An array of payment recipients created for Payment Initiation * @type {Array} @@ -26769,7 +26321,6 @@ export interface PaymentInitiationRecipientListResponse { * @interface PaymentInitiationStandingOrderMetadata */ export interface PaymentInitiationStandingOrderMetadata { - [key: string]: object | unknown; /** * Indicates whether the institution supports closed-ended standing orders by providing an end date. * @type {boolean} @@ -26795,7 +26346,6 @@ export interface PaymentInitiationStandingOrderMetadata { * @interface PaymentMeta */ export interface PaymentMeta { - [key: string]: object | unknown; /** * The transaction reference number supplied by the financial institution. * @type {string} @@ -26870,7 +26420,6 @@ export interface PaymentProfileCreateRequest { * @interface PaymentProfileCreateResponse */ export interface PaymentProfileCreateResponse { - [key: string]: object | unknown; /** * A payment profile token associated with the Payment Profile data that is being requested. * @type {string} @@ -26915,7 +26464,6 @@ export interface PaymentProfileGetRequest { * @interface PaymentProfileGetResponse */ export interface PaymentProfileGetResponse { - [key: string]: object | unknown; /** * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time the given Payment Profile was updated at * @type {string} @@ -26978,7 +26526,6 @@ export interface PaymentProfileRemoveRequest { * @interface PaymentProfileRemoveResponse */ export interface PaymentProfileRemoveResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -27023,7 +26570,6 @@ export declare enum PaymentScheme { * @interface PaymentStatusUpdateWebhook */ export interface PaymentStatusUpdateWebhook { - [key: string]: object | unknown; /** * `PAYMENT_INITIATION` * @type {string} @@ -27109,7 +26655,6 @@ export interface PaymentStatusUpdateWebhook { * @interface PayrollIncomeAccountData */ export interface PayrollIncomeAccountData { - [key: string]: object | unknown; /** * ID of the payroll provider account. * @type {string} @@ -27135,7 +26680,6 @@ export interface PayrollIncomeAccountData { * @interface PayrollIncomeObject */ export interface PayrollIncomeObject { - [key: string]: object | unknown; /** * ID of the payroll provider account. * @type {string} @@ -27167,7 +26711,6 @@ export interface PayrollIncomeObject { * @interface PayrollIncomeRateOfPay */ export interface PayrollIncomeRateOfPay { - [key: string]: object | unknown; /** * The rate at which an employee is paid. * @type {string} @@ -27236,7 +26779,6 @@ export interface PayrollItem { * @interface PayrollItemStatus */ export interface PayrollItemStatus { - [key: string]: object | unknown; /** * Denotes the processing status for the verification. `UNKNOWN`: The processing status could not be determined. `PROCESSING_COMPLETE`: The processing has completed and the user has approved for sharing. The data is available to be retrieved. `PROCESSING`: The verification is still processing. The data is not available yet. `FAILED`: The processing failed to complete successfully. `APPROVAL_STATUS_PENDING`: The processing has completed but the user has not yet approved the sharing of the data. * @type {string} @@ -27250,7 +26792,6 @@ export interface PayrollItemStatus { * @interface PayrollRiskSignalsItem */ export interface PayrollRiskSignalsItem { - [key: string]: object | unknown; /** * The `item_id` of the Item associated with this webhook, warning, or error * @type {string} @@ -27270,7 +26811,6 @@ export interface PayrollRiskSignalsItem { * @interface Paystub */ export interface Paystub { - [key: string]: object | unknown; /** * * @type {Deductions} @@ -27348,7 +26888,6 @@ export interface Paystub { * @interface PaystubAddress */ export interface PaystubAddress { - [key: string]: object | unknown; /** * The full city name. * @type {string} @@ -27407,7 +26946,6 @@ export interface PaystubAddress { * @interface PaystubDeduction */ export interface PaystubDeduction { - [key: string]: object | unknown; /** * The description of the deduction, as provided on the paystub. For example: `\"401(k)\"`, `\"FICA MED TAX\"`. * @type {string} @@ -27433,7 +26971,6 @@ export interface PaystubDeduction { * @interface PaystubDetails */ export interface PaystubDetails { - [key: string]: object | unknown; /** * Beginning date of the pay period on the paystub in the \'YYYY-MM-DD\' format. * @type {string} @@ -27471,7 +27008,6 @@ export interface PaystubDetails { * @interface PaystubEmployer */ export interface PaystubEmployer { - [key: string]: object | unknown; /** * * @type {PaystubAddress} @@ -27522,7 +27058,6 @@ export interface PaystubOverride { * @interface PaystubOverrideDistributionBreakdown */ export interface PaystubOverrideDistributionBreakdown { - [key: string]: object | unknown; /** * Name of the account for the given distribution. * @type {string} @@ -27635,7 +27170,6 @@ export interface PaystubOverrideEmployer { * @interface PaystubOverridePayPeriodDetails */ export interface PaystubOverridePayPeriodDetails { - [key: string]: object | unknown; /** * The amount of the paycheck. * @type {number} @@ -27704,7 +27238,6 @@ export declare enum PaystubPayFrequency { * @interface PaystubYTDDetails */ export interface PaystubYTDDetails { - [key: string]: object | unknown; /** * Year-to-date gross earnings. * @type {number} @@ -27724,7 +27257,6 @@ export interface PaystubYTDDetails { * @interface PendingExpirationWebhook */ export interface PendingExpirationWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -27762,7 +27294,6 @@ export interface PendingExpirationWebhook { * @interface PersonalFinanceCategory */ export interface PersonalFinanceCategory { - [key: string]: object | unknown; /** * A high level category that communicates the broad category of the transaction. * @type {string} @@ -27788,7 +27319,6 @@ export interface PersonalFinanceCategory { * @interface PhoneNumber */ export interface PhoneNumber { - [key: string]: object | unknown; /** * The phone number. * @type {string} @@ -27826,7 +27356,6 @@ export declare enum PhoneNumberTypeEnum { * @interface PhoneNumberMatchScore */ export interface PhoneNumberMatchScore { - [key: string]: object | unknown; /** * Match score for normalized phone number. 100 is a perfect match, 99-70 is a partial match (matching the same phone number with extension against one without extension, etc.), anything below 70 is considered a mismatch. Typically, the match threshold should be set to a score of 70 or higher. If the phone number is missing from either the API or financial institution, this is null. * @type {number} @@ -27862,7 +27391,6 @@ export declare enum PhysicalDocumentCategory { * @interface PhysicalDocumentExtractedData */ export interface PhysicalDocumentExtractedData { - [key: string]: object | unknown; /** * Alpha-numeric ID number extracted via OCR from the user\'s document image. * @type {string} @@ -27912,7 +27440,6 @@ export interface PhysicalDocumentExtractedData { * @interface PhysicalDocumentExtractedDataAnalysis */ export interface PhysicalDocumentExtractedDataAnalysis { - [key: string]: object | unknown; /** * * @type {DocumentNameMatchCode} @@ -27944,7 +27471,6 @@ export interface PhysicalDocumentExtractedDataAnalysis { * @interface PhysicalDocumentImages */ export interface PhysicalDocumentImages { - [key: string]: object | unknown; /** * Temporary URL that expires after 60 seconds for downloading the uncropped original image of the front of the document. * @type {string} @@ -27982,7 +27508,6 @@ export interface PhysicalDocumentImages { * @interface PlaidError */ export interface PlaidError { - [key: string]: object | unknown; /** * * @type {PlaidErrorType} @@ -28065,7 +27590,6 @@ export declare enum PlaidErrorType { * @interface PlatformIds */ export interface PlatformIds { - [key: string]: object | unknown; /** * The ID of an employee as given by their employer * @type {string} @@ -28116,7 +27640,6 @@ export interface ProcessorAccountGetRequest { * @interface ProcessorAccountGetResponse */ export interface ProcessorAccountGetResponse { - [key: string]: object | unknown; /** * * @type {AccountBase} @@ -28192,7 +27715,6 @@ export interface ProcessorAuthGetRequest { * @interface ProcessorAuthGetResponse */ export interface ProcessorAuthGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -28262,7 +27784,6 @@ export interface ProcessorBalanceGetRequestOptions { * @interface ProcessorBalanceGetResponse */ export interface ProcessorBalanceGetResponse { - [key: string]: object | unknown; /** * * @type {AccountBase} @@ -28375,7 +27896,6 @@ export interface ProcessorBankTransferCreateRequest { * @interface ProcessorBankTransferCreateResponse */ export interface ProcessorBankTransferCreateResponse { - [key: string]: object | unknown; /** * * @type {BankTransfer} @@ -28395,7 +27915,6 @@ export interface ProcessorBankTransferCreateResponse { * @interface ProcessorDefaultUpdateWebhook */ export interface ProcessorDefaultUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -28439,7 +27958,6 @@ export interface ProcessorDefaultUpdateWebhook { * @interface ProcessorHistoricalUpdateWebhook */ export interface ProcessorHistoricalUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -28508,7 +28026,6 @@ export interface ProcessorIdentityGetRequest { * @interface ProcessorIdentityGetResponse */ export interface ProcessorIdentityGetResponse { - [key: string]: object | unknown; /** * * @type {AccountIdentity} @@ -28559,7 +28076,6 @@ export interface ProcessorIdentityMatchRequest { * @interface ProcessorIdentityMatchResponse */ export interface ProcessorIdentityMatchResponse { - [key: string]: object | unknown; /** * * @type {AccountIdentityMatchScore} @@ -28579,7 +28095,6 @@ export interface ProcessorIdentityMatchResponse { * @interface ProcessorInitialUpdateWebhook */ export interface ProcessorInitialUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -28648,7 +28163,6 @@ export interface ProcessorLiabilitiesGetRequest { * @interface ProcessorLiabilitiesGetResponse */ export interface ProcessorLiabilitiesGetResponse { - [key: string]: object | unknown; /** * * @type {AccountBase} @@ -28674,7 +28188,6 @@ export interface ProcessorLiabilitiesGetResponse { * @interface ProcessorNumber */ export interface ProcessorNumber { - [key: string]: object | unknown; /** * * @type {NumbersACHNullable} @@ -28706,7 +28219,6 @@ export interface ProcessorNumber { * @interface ProcessorRecurringTransactionsUpdateWebhook */ export interface ProcessorRecurringTransactionsUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -28799,7 +28311,6 @@ export interface ProcessorSignalDecisionReportRequest { * @interface ProcessorSignalDecisionReportResponse */ export interface ProcessorSignalDecisionReportResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -28886,7 +28397,6 @@ export interface ProcessorSignalEvaluateRequest { * @interface ProcessorSignalEvaluateResponse */ export interface ProcessorSignalEvaluateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -28943,7 +28453,6 @@ export interface ProcessorSignalPrepareRequest { * @interface ProcessorSignalPrepareResponse */ export interface ProcessorSignalPrepareResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29000,7 +28509,6 @@ export interface ProcessorSignalReturnReportRequest { * @interface ProcessorSignalReturnReportResponse */ export interface ProcessorSignalReturnReportResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29045,7 +28553,6 @@ export interface ProcessorStripeBankAccountTokenCreateRequest { * @interface ProcessorStripeBankAccountTokenCreateResponse */ export interface ProcessorStripeBankAccountTokenCreateResponse { - [key: string]: object | unknown; /** * A token that can be sent to Stripe for use in making API calls to Plaid * @type {string} @@ -29065,7 +28572,6 @@ export interface ProcessorStripeBankAccountTokenCreateResponse { * @interface ProcessorSyncUpdatesAvailableWebhook */ export interface ProcessorSyncUpdatesAvailableWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -29197,7 +28703,6 @@ export declare enum ProcessorTokenCreateRequestProcessorEnum { * @interface ProcessorTokenCreateResponse */ export interface ProcessorTokenCreateResponse { - [key: string]: object | unknown; /** * The `processor_token` that can then be used by the Plaid partner to make API requests * @type {string} @@ -29242,7 +28747,6 @@ export interface ProcessorTokenPermissionsGetRequest { * @interface ProcessorTokenPermissionsGetResponse */ export interface ProcessorTokenPermissionsGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29293,7 +28797,6 @@ export interface ProcessorTokenPermissionsSetRequest { * @interface ProcessorTokenPermissionsSetResponse */ export interface ProcessorTokenPermissionsSetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29307,7 +28810,6 @@ export interface ProcessorTokenPermissionsSetResponse { * @interface ProcessorTokenWebhookUpdate */ export interface ProcessorTokenWebhookUpdate { - [key: string]: object | unknown; /** * `PROCESSOR_TOKEN` * @type {string} @@ -29382,7 +28884,6 @@ export interface ProcessorTokenWebhookUpdateRequest { * @interface ProcessorTokenWebhookUpdateResponse */ export interface ProcessorTokenWebhookUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29485,7 +28986,6 @@ export interface ProcessorTransactionsGetRequestOptions { * @interface ProcessorTransactionsGetResponse */ export interface ProcessorTransactionsGetResponse { - [key: string]: object | unknown; /** * * @type {AccountBase} @@ -29548,7 +29048,6 @@ export interface ProcessorTransactionsRecurringGetRequest { * @interface ProcessorTransactionsRecurringGetResponse */ export interface ProcessorTransactionsRecurringGetResponse { - [key: string]: object | unknown; /** * An array of depository transaction streams. * @type {Array} @@ -29605,7 +29104,6 @@ export interface ProcessorTransactionsRefreshRequest { * @interface ProcessorTransactionsRefreshResponse */ export interface ProcessorTransactionsRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -29619,7 +29117,6 @@ export interface ProcessorTransactionsRefreshResponse { * @interface ProcessorTransactionsRemovedWebhook */ export interface ProcessorTransactionsRemovedWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -29706,7 +29203,6 @@ export interface ProcessorTransactionsSyncRequest { * @interface ProcessorTransactionsSyncResponse */ export interface ProcessorTransactionsSyncResponse { - [key: string]: object | unknown; /** * Transactions that have been added to the Item since `cursor` ordered by ascending last modified time. * @type {Array} @@ -29750,7 +29246,6 @@ export interface ProcessorTransactionsSyncResponse { * @interface ProductAccess */ export interface ProductAccess { - [key: string]: object | unknown; /** * Allow access to statements. Only used by certain partners. If relevant to the partner and unset, defaults to `true`. * @type {boolean} @@ -29812,7 +29307,6 @@ export interface ProductAccess { * @interface ProductPermissionsRequiredAuthWebhook */ export interface ProductPermissionsRequiredAuthWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -29844,7 +29338,6 @@ export interface ProductPermissionsRequiredAuthWebhook { * @interface ProductPermissionsRequiredIdentityWebhook */ export interface ProductPermissionsRequiredIdentityWebhook { - [key: string]: object | unknown; /** * `IDENTITY` * @type {string} @@ -29876,7 +29369,6 @@ export interface ProductPermissionsRequiredIdentityWebhook { * @interface ProductStatus */ export interface ProductStatus { - [key: string]: object | unknown; /** * This field is deprecated in favor of the `breakdown` object, which provides more granular institution health data. `HEALTHY`: the majority of requests are successful `DEGRADED`: only some requests are successful `DOWN`: all requests are failing * @type {string} @@ -29912,7 +29404,6 @@ export declare enum ProductStatusStatusEnum { * @interface ProductStatusBreakdown */ export interface ProductStatusBreakdown { - [key: string]: object | unknown; /** * The percentage of login attempts that are successful, expressed as a decimal. * @type {number} @@ -30023,7 +29514,6 @@ export declare enum ProxyType { * @interface RecaptchaRequiredError */ export interface RecaptchaRequiredError { - [key: string]: object | unknown; /** * RECAPTCHA_ERROR * @type {string} @@ -30073,7 +29563,6 @@ export interface RecaptchaRequiredError { * @interface RecipientBACS */ export interface RecipientBACS { - [key: string]: object | unknown; /** * The account number of the account. Maximum of 10 characters. * @type {string} @@ -30112,7 +29601,6 @@ export interface RecipientBACSNullable { * @interface Recurrence */ export interface Recurrence { - [key: string]: object | unknown; /** * Whether or not the transaction is periodically recurring. * @type {boolean} @@ -30132,7 +29620,6 @@ export interface Recurrence { * @interface RecurringCancelledWebhook */ export interface RecurringCancelledWebhook { - [key: string]: object | unknown; /** * `TRANSFER` * @type {string} @@ -30180,7 +29667,6 @@ export declare enum RecurringFrequency { * @interface RecurringInsightsStream */ export interface RecurringInsightsStream { - [key: string]: object | unknown; /** * A unique id for the stream. * @type {string} @@ -30278,7 +29764,6 @@ export interface RecurringInsightsStream { * @interface RecurringNewTransferWebhook */ export interface RecurringNewTransferWebhook { - [key: string]: object | unknown; /** * `TRANSFER` * @type {string} @@ -30329,7 +29814,6 @@ export declare enum RecurringTransactionFrequency { * @interface RecurringTransactions */ export interface RecurringTransactions { - [key: string]: object | unknown; /** * An array of inflow transaction streams (e.g., income). * @type {Array} @@ -30349,7 +29833,6 @@ export interface RecurringTransactions { * @interface RecurringTransactionsUpdateWebhook */ export interface RecurringTransactionsUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -30387,7 +29870,6 @@ export interface RecurringTransactionsUpdateWebhook { * @interface RecurringTransfer */ export interface RecurringTransfer { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a recurring transfer. * @type {string} @@ -30608,7 +30090,6 @@ export interface RecurringTransferNullable { * @interface RecurringTransferSkippedWebhook */ export interface RecurringTransferSkippedWebhook { - [key: string]: object | unknown; /** * `TRANSFER` * @type {string} @@ -30679,7 +30160,6 @@ export declare enum ReportType { * @interface ReportingInformation */ export interface ReportingInformation { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -30693,7 +30173,6 @@ export interface ReportingInformation { * @interface RiskCheckBehavior */ export interface RiskCheckBehavior { - [key: string]: object | unknown; /** * * @type {RiskCheckBehaviorUserInteractionsLabel} @@ -30750,7 +30229,6 @@ export declare enum RiskCheckBehaviorUserInteractionsLabel { * @interface RiskCheckDetails */ export interface RiskCheckDetails { - [key: string]: object | unknown; /** * * @type {IdentityVerificationStepStatus} @@ -30794,7 +30272,6 @@ export interface RiskCheckDetails { * @interface RiskCheckDevice */ export interface RiskCheckDevice { - [key: string]: object | unknown; /** * * @type {ProxyType} @@ -30820,7 +30297,6 @@ export interface RiskCheckDevice { * @interface RiskCheckEmail */ export interface RiskCheckEmail { - [key: string]: object | unknown; /** * * @type {RiskCheckEmailIsDeliverableStatus} @@ -30938,7 +30414,6 @@ export declare enum RiskCheckEmailTopLevelDomainIsSuspicious { * @interface RiskCheckIdentityAbuseSignals */ export interface RiskCheckIdentityAbuseSignals { - [key: string]: object | unknown; /** * * @type {RiskCheckSyntheticIdentity} @@ -30999,7 +30474,6 @@ export declare enum RiskCheckLinkedService { * @interface RiskCheckPhone */ export interface RiskCheckPhone { - [key: string]: object | unknown; /** * A list of online services where this phone number has been detected to have accounts or other activity. * @type {Set} @@ -31013,7 +30487,6 @@ export interface RiskCheckPhone { * @interface RiskCheckStolenIdentity */ export interface RiskCheckStolenIdentity { - [key: string]: object | unknown; /** * A score from 0 to 100 indicating the likelihood that the user is a stolen identity. * @type {number} @@ -31027,7 +30500,6 @@ export interface RiskCheckStolenIdentity { * @interface RiskCheckSyntheticIdentity */ export interface RiskCheckSyntheticIdentity { - [key: string]: object | unknown; /** * A score from 0 to 100 indicating the likelihood that the user is a synthetic identity. * @type {number} @@ -31060,7 +30532,6 @@ export interface RiskProfile { * @interface RiskSignalDocumentReference */ export interface RiskSignalDocumentReference { - [key: string]: object | unknown; /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -31098,7 +30569,6 @@ export declare enum RiskSignalDocumentStatus { * @interface Role */ export interface Role { - [key: string]: object | unknown; /** * * @type {RoleDetail} @@ -31112,7 +30582,6 @@ export interface Role { * @interface RoleDetail */ export interface RoleDetail { - [key: string]: object | unknown; /** * * @type {PartyRoleType} @@ -31126,7 +30595,6 @@ export interface RoleDetail { * @interface Roles */ export interface Roles { - [key: string]: object | unknown; /** * * @type {Role} @@ -31177,7 +30645,6 @@ export interface SandboxBankIncomeFireWebhookRequest { * @interface SandboxBankIncomeFireWebhookResponse */ export interface SandboxBankIncomeFireWebhookResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31244,7 +30711,6 @@ export interface SandboxBankTransferFireWebhookRequest { * @interface SandboxBankTransferFireWebhookResponse */ export interface SandboxBankTransferFireWebhookResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31295,7 +30761,6 @@ export interface SandboxBankTransferSimulateRequest { * @interface SandboxBankTransferSimulateResponse */ export interface SandboxBankTransferSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31367,7 +30832,6 @@ export declare enum SandboxIncomeFireWebhookRequestVerificationStatusEnum { * @interface SandboxIncomeFireWebhookResponse */ export interface SandboxIncomeFireWebhookResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31441,7 +30905,6 @@ export declare enum SandboxItemFireWebhookRequestWebhookCodeEnum { * @interface SandboxItemFireWebhookResponse */ export interface SandboxItemFireWebhookResponse { - [key: string]: object | unknown; /** * Value is `true` if the test` webhook_code` was successfully fired. * @type {boolean} @@ -31486,7 +30949,6 @@ export interface SandboxItemResetLoginRequest { * @interface SandboxItemResetLoginResponse */ export interface SandboxItemResetLoginResponse { - [key: string]: object | unknown; /** * `true` if the call succeeded * @type {boolean} @@ -31551,7 +31013,6 @@ export declare enum SandboxItemSetVerificationStatusRequestVerificationStatusEnu * @interface SandboxItemSetVerificationStatusResponse */ export interface SandboxItemSetVerificationStatusResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31609,7 +31070,6 @@ export interface SandboxPaymentProfileResetLoginRequest { * @interface SandboxPaymentProfileResetLoginResponse */ export interface SandboxPaymentProfileResetLoginResponse { - [key: string]: object | unknown; /** * `true` if the call succeeded * @type {boolean} @@ -31679,7 +31139,6 @@ export interface SandboxProcessorTokenCreateRequestOptions { * @interface SandboxProcessorTokenCreateResponse */ export interface SandboxProcessorTokenCreateResponse { - [key: string]: object | unknown; /** * A processor token that can be used to call the `/processor/` endpoints. * @type {string} @@ -31836,7 +31295,6 @@ export interface SandboxPublicTokenCreateRequestOptionsTransactions { * @interface SandboxPublicTokenCreateResponse */ export interface SandboxPublicTokenCreateResponse { - [key: string]: object | unknown; /** * A public token that can be exchanged for an access token using `/item/public_token/exchange` * @type {string} @@ -31881,7 +31339,6 @@ export interface SandboxTransferFireWebhookRequest { * @interface SandboxTransferFireWebhookResponse */ export interface SandboxTransferFireWebhookResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31932,7 +31389,6 @@ export interface SandboxTransferLedgerDepositSimulateRequest { * @interface SandboxTransferLedgerDepositSimulateResponse */ export interface SandboxTransferLedgerDepositSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -31971,7 +31427,6 @@ export interface SandboxTransferLedgerSimulateAvailableRequest { * @interface SandboxTransferLedgerSimulateAvailableResponse */ export interface SandboxTransferLedgerSimulateAvailableResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32022,7 +31477,6 @@ export interface SandboxTransferLedgerWithdrawSimulateRequest { * @interface SandboxTransferLedgerWithdrawSimulateResponse */ export interface SandboxTransferLedgerWithdrawSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32079,7 +31533,6 @@ export interface SandboxTransferRefundSimulateRequest { * @interface SandboxTransferRefundSimulateResponse */ export interface SandboxTransferRefundSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32112,7 +31565,6 @@ export interface SandboxTransferRepaymentSimulateRequest { * @interface SandboxTransferRepaymentSimulateResponse */ export interface SandboxTransferRepaymentSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32169,7 +31621,6 @@ export interface SandboxTransferSimulateRequest { * @interface SandboxTransferSimulateResponse */ export interface SandboxTransferSimulateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32208,7 +31659,6 @@ export interface SandboxTransferSweepSimulateRequest { * @interface SandboxTransferSweepSimulateResponse */ export interface SandboxTransferSweepSimulateResponse { - [key: string]: object | unknown; /** * * @type {SimulatedTransferSweep} @@ -32259,7 +31709,6 @@ export interface SandboxTransferTestClockAdvanceRequest { * @interface SandboxTransferTestClockAdvanceResponse */ export interface SandboxTransferTestClockAdvanceResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -32298,7 +31747,6 @@ export interface SandboxTransferTestClockCreateRequest { * @interface SandboxTransferTestClockCreateResponse */ export interface SandboxTransferTestClockCreateResponse { - [key: string]: object | unknown; /** * * @type {TransferTestClock} @@ -32343,7 +31791,6 @@ export interface SandboxTransferTestClockGetRequest { * @interface SandboxTransferTestClockGetResponse */ export interface SandboxTransferTestClockGetResponse { - [key: string]: object | unknown; /** * * @type {TransferTestClock} @@ -32406,7 +31853,6 @@ export interface SandboxTransferTestClockListRequest { * @interface SandboxTransferTestClockListResponse */ export interface SandboxTransferTestClockListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -32485,7 +31931,6 @@ export interface ScopesNullable { * @interface ScreeningHitAnalysis */ export interface ScreeningHitAnalysis { - [key: string]: object | unknown; /** * * @type {MatchSummaryCode} @@ -32523,7 +31968,6 @@ export interface ScreeningHitAnalysis { * @interface ScreeningHitData */ export interface ScreeningHitData { - [key: string]: object | unknown; /** * Dates of birth associated with the watchlist hit * @type {Array} @@ -32555,7 +31999,6 @@ export interface ScreeningHitData { * @interface ScreeningHitDateOfBirthItem */ export interface ScreeningHitDateOfBirthItem { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -32575,7 +32018,6 @@ export interface ScreeningHitDateOfBirthItem { * @interface ScreeningHitDocumentsItems */ export interface ScreeningHitDocumentsItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -32595,7 +32037,6 @@ export interface ScreeningHitDocumentsItems { * @interface ScreeningHitNamesItems */ export interface ScreeningHitNamesItems { - [key: string]: object | unknown; /** * * @type {MatchSummary} @@ -32615,7 +32056,6 @@ export interface ScreeningHitNamesItems { * @interface ScreeningStatusUpdatedWebhook */ export interface ScreeningStatusUpdatedWebhook { - [key: string]: object | unknown; /** * `SCREENING` * @type {string} @@ -32647,7 +32087,6 @@ export interface ScreeningStatusUpdatedWebhook { * @interface Security */ export interface Security { - [key: string]: object | unknown; /** * A unique, Plaid-specific identifier for the security, used to associate securities with holdings. Like all Plaid identifiers, the `security_id` is case sensitive. The `security_id` may change if inherent details of the security change due to a corporate action, for example, in the event of a ticker symbol change or CUSIP change. * @type {string} @@ -32806,7 +32245,6 @@ export interface SecurityOverride { * @interface SelfieAnalysis */ export interface SelfieAnalysis { - [key: string]: object | unknown; /** * * @type {SelfieAnalysisDocumentComparison} @@ -32830,7 +32268,6 @@ export declare enum SelfieAnalysisDocumentComparison { * @interface SelfieCapture */ export interface SelfieCapture { - [key: string]: object | unknown; /** * Temporary URL for downloading an image selfie capture. * @type {string} @@ -32850,7 +32287,6 @@ export interface SelfieCapture { * @interface SelfieCheck */ export interface SelfieCheck { - [key: string]: object | unknown; /** * * @type {SelfieCheckStatus} @@ -32870,7 +32306,6 @@ export interface SelfieCheck { * @interface SelfieCheckSelfie */ export interface SelfieCheckSelfie { - [key: string]: object | unknown; /** * * @type {SelfieStatus} @@ -32939,7 +32374,6 @@ export interface SenderBACSNullable { * @interface Service */ export interface Service { - [key: string]: object | unknown; /** * * @type {VerificationOfAsset} @@ -32959,7 +32393,6 @@ export interface Service { * @interface ServiceProductFulfillment */ export interface ServiceProductFulfillment { - [key: string]: object | unknown; /** * * @type {ServiceProductFulfillmentDetail} @@ -32973,7 +32406,6 @@ export interface ServiceProductFulfillment { * @interface ServiceProductFulfillmentDetail */ export interface ServiceProductFulfillmentDetail { - [key: string]: object | unknown; /** * A string that uniquely identifies a type of order Verification of Asset. * @type {string} @@ -33002,7 +32434,6 @@ export declare enum ServiceProductFulfillmentIdentifier { * @interface ServicerAddressData */ export interface ServicerAddressData { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -33040,7 +32471,6 @@ export interface ServicerAddressData { * @interface Services */ export interface Services { - [key: string]: object | unknown; /** * * @type {Service} @@ -33054,7 +32484,6 @@ export interface Services { * @interface SignalAddressData */ export interface SignalAddressData { - [key: string]: object | unknown; /** * The full city name * @type {string} @@ -33159,7 +32588,6 @@ export interface SignalDecisionReportRequest { * @interface SignalDecisionReportResponse */ export interface SignalDecisionReportResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33686,7 +33114,6 @@ export interface SignalEvaluateRequest { * @interface SignalEvaluateResponse */ export interface SignalEvaluateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33799,7 +33226,6 @@ export interface SignalPrepareRequest { * @interface SignalPrepareResponse */ export interface SignalPrepareResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33850,7 +33276,6 @@ export interface SignalReturnReportRequest { * @interface SignalReturnReportResponse */ export interface SignalReturnReportResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -33864,7 +33289,6 @@ export interface SignalReturnReportResponse { * @interface SignalScores */ export interface SignalScores { - [key: string]: object | unknown; /** * * @type {CustomerInitiatedReturnRisk} @@ -34007,7 +33431,6 @@ export interface SimulatedTransferSweep { * @interface SingleDocumentRiskSignal */ export interface SingleDocumentRiskSignal { - [key: string]: object | unknown; /** * * @type {RiskSignalDocumentReference} @@ -34044,7 +33467,6 @@ export declare enum Source { * @interface StandaloneAccountType */ export interface StandaloneAccountType { - [key: string]: object | unknown; /** * An account type holding cash, in which funds are deposited. Supported products for `depository` accounts are: Auth (`checking` and `savings` types only), Balance, Transactions, Identity, Payment Initiation, Assets, and Investments (`cash management` type only). * @type {string} @@ -34082,7 +33504,6 @@ export interface StandaloneAccountType { * @interface StandaloneCurrencyCodeList */ export interface StandaloneCurrencyCodeList { - [key: string]: object | unknown; /** * Plaid supports all ISO 4217 currency codes. * @type {string} @@ -34102,7 +33523,6 @@ export interface StandaloneCurrencyCodeList { * @interface StandaloneInvestmentTransactionType */ export interface StandaloneInvestmentTransactionType { - [key: string]: object | unknown; /** * Buying an investment * @type {string} @@ -34146,7 +33566,6 @@ export interface StandaloneInvestmentTransactionType { * @interface StatementsAccount */ export interface StatementsAccount { - [key: string]: object | unknown; /** * Plaid\'s unique identifier for the account. * @type {string} @@ -34252,7 +33671,6 @@ export interface StatementsListRequest { * @interface StatementsListResponse */ export interface StatementsListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -34299,7 +33717,6 @@ export declare enum StatementsRefreshCompleteResult { * @interface StatementsRefreshCompleteWebhook */ export interface StatementsRefreshCompleteWebhook { - [key: string]: object | unknown; /** * `STATEMENTS` * @type {string} @@ -34374,7 +33791,6 @@ export interface StatementsRefreshRequest { * @interface StatementsRefreshResponse */ export interface StatementsRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -34388,7 +33804,6 @@ export interface StatementsRefreshResponse { * @interface StatementsStatement */ export interface StatementsStatement { - [key: string]: object | unknown; /** * Plaid\'s unique identifier for the statement. * @type {string} @@ -34414,7 +33829,6 @@ export interface StatementsStatement { * @interface Status */ export interface Status { - [key: string]: object | unknown; /** * Satus Code. * @type {string} @@ -34434,7 +33848,6 @@ export interface Status { * @interface Statuses */ export interface Statuses { - [key: string]: object | unknown; /** * * @type {Status} @@ -34459,7 +33872,6 @@ export declare enum Strategy { * @interface StudentLoan */ export interface StudentLoan { - [key: string]: object | unknown; /** * The ID of the account that this liability belongs to. * @type {string} @@ -34611,7 +34023,6 @@ export interface StudentLoan { * @interface StudentLoanRepaymentModel */ export interface StudentLoanRepaymentModel { - [key: string]: object | unknown; /** * The only currently supported value for this field is `standard`. * @type {string} @@ -34637,7 +34048,6 @@ export interface StudentLoanRepaymentModel { * @interface StudentLoanStatus */ export interface StudentLoanStatus { - [key: string]: object | unknown; /** * The date until which the loan will be in its current status. Dates are returned in an [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (YYYY-MM-DD). * @type {string} @@ -34681,7 +34091,6 @@ export declare enum StudentLoanStatusTypeEnum { * @interface StudentRepaymentPlan */ export interface StudentRepaymentPlan { - [key: string]: object | unknown; /** * The description of the repayment plan as provided by the servicer. * @type {string} @@ -34743,7 +34152,6 @@ export declare enum SweepTrigger { * @interface SyncUpdatesAvailableWebhook */ export interface SyncUpdatesAvailableWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -34787,7 +34195,6 @@ export interface SyncUpdatesAvailableWebhook { * @interface Taxform */ export interface Taxform { - [key: string]: object | unknown; /** * An identifier of the document referenced by the document metadata. * @type {string} @@ -34813,7 +34220,6 @@ export interface Taxform { * @interface TaxpayerID */ export interface TaxpayerID { - [key: string]: object | unknown; /** * Type of ID, e.g. \'SSN\' * @type {string} @@ -34840,7 +34246,6 @@ export interface TaxpayerID { * @interface TaxpayerIdentifier */ export interface TaxpayerIdentifier { - [key: string]: object | unknown; /** * * @type {TaxpayerIdentifierType} @@ -34869,7 +34274,6 @@ export declare enum TaxpayerIdentifierType { * @interface TaxpayerIdentifiers */ export interface TaxpayerIdentifiers { - [key: string]: object | unknown; /** * * @type {TaxpayerIdentifier} @@ -34883,7 +34287,6 @@ export interface TaxpayerIdentifiers { * @interface Total */ export interface Total { - [key: string]: object | unknown; /** * * @type {TotalCanonicalDescription} @@ -35214,7 +34617,6 @@ export declare enum TransactionAllOfPaymentChannelEnum { * @interface TransactionBase */ export interface TransactionBase { - [key: string]: object | unknown; /** * The ID of the account in which this transaction occurred. * @type {string} @@ -35375,7 +34777,6 @@ export declare enum TransactionCode { * @interface TransactionCounterparty */ export interface TransactionCounterparty { - [key: string]: object | unknown; /** * The name of the counterparty, such as the merchant or the financial institution, as extracted by Plaid from the raw description. * @type {string} @@ -35419,7 +34820,6 @@ export interface TransactionCounterparty { * @interface TransactionData */ export interface TransactionData { - [key: string]: object | unknown; /** * The description of the transaction. * @type {string} @@ -35457,7 +34857,6 @@ export interface TransactionData { * @interface TransactionOverride */ export interface TransactionOverride { - [key: string]: object | unknown; /** * The date of the transaction, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) (YYYY-MM-DD) format. Transactions in Sandbox will move from pending to posted once their transaction date has been reached. If a `date_transacted` is not provided by the institution, a transaction date may be available in the [`authorized_date`](https://plaid.com/docs/api/products/transactions/#transactions-get-response-transactions-authorized-date) field. * @type {string} @@ -35495,7 +34894,6 @@ export interface TransactionOverride { * @interface TransactionStream */ export interface TransactionStream { - [key: string]: object | unknown; /** * The ID of the account to which the stream belongs * @type {string} @@ -35607,7 +35005,6 @@ export interface TransactionStream { * @interface TransactionStreamAmount */ export interface TransactionStreamAmount { - [key: string]: object | unknown; /** * Represents the numerical value of an amount. * @type {number} @@ -35712,7 +35109,6 @@ export interface TransactionsEnhanceGetRequest { * @interface TransactionsEnhanceGetResponse */ export interface TransactionsEnhanceGetResponse { - [key: string]: object | unknown; /** * An array of enhanced transactions. * @type {Array} @@ -35776,7 +35172,6 @@ export interface TransactionsEnrichRequestOptions { * @interface TransactionsEnrichResponse */ export interface TransactionsEnrichResponse { - [key: string]: object | unknown; /** * A list of enriched transactions. * @type {Array} @@ -35897,7 +35292,6 @@ export interface TransactionsGetRequestOptions { * @interface TransactionsGetResponse */ export interface TransactionsGetResponse { - [key: string]: object | unknown; /** * An array containing the `accounts` associated with the Item for which transactions are being returned. Each transaction can be mapped to its corresponding account via the `account_id` field. * @type {Array} @@ -35979,7 +35373,6 @@ export interface TransactionsRecurringCreateRequest { * @interface TransactionsRecurringCreateResponse */ export interface TransactionsRecurringCreateResponse { - [key: string]: object | unknown; /** * Streams created as a result of the operation. * @type {Array} @@ -36056,7 +35449,6 @@ export interface TransactionsRecurringGetRequestOptions { * @interface TransactionsRecurringGetResponse */ export interface TransactionsRecurringGetResponse { - [key: string]: object | unknown; /** * An array of depository transaction streams. * @type {Array} @@ -36132,7 +35524,6 @@ export interface TransactionsRecurringMergeRequest { * @interface TransactionsRecurringMergeResponse */ export interface TransactionsRecurringMergeResponse { - [key: string]: object | unknown; /** * Directly modified stream, along with other streams with transactions removed from them as a result of the operation (in no particular order). * @type {Array} @@ -36202,7 +35593,6 @@ export interface TransactionsRecurringUpdateRequest { * @interface TransactionsRecurringUpdateResponse */ export interface TransactionsRecurringUpdateResponse { - [key: string]: object | unknown; /** * Directly modified stream, along with other streams with transactions removed from them as a result of the operation (in no particular order). * @type {Array} @@ -36247,7 +35637,6 @@ export interface TransactionsRefreshRequest { * @interface TransactionsRefreshResponse */ export interface TransactionsRefreshResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -36261,7 +35650,6 @@ export interface TransactionsRefreshResponse { * @interface TransactionsRemovedWebhook */ export interface TransactionsRemovedWebhook { - [key: string]: object | unknown; /** * `TRANSACTIONS` * @type {string} @@ -36385,7 +35773,6 @@ export interface TransactionsRulesCreateRequest { * @interface TransactionsRulesCreateResponse */ export interface TransactionsRulesCreateResponse { - [key: string]: object | unknown; /** * * @type {TransactionsCategoryRule} @@ -36430,7 +35817,6 @@ export interface TransactionsRulesListRequest { * @interface TransactionsRulesListResponse */ export interface TransactionsRulesListResponse { - [key: string]: object | unknown; /** * A list of the Item\'s transaction rules * @type {Array} @@ -36481,7 +35867,6 @@ export interface TransactionsRulesRemoveRequest { * @interface TransactionsRulesRemoveResponse */ export interface TransactionsRulesRemoveResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -36571,7 +35956,6 @@ export interface TransactionsSyncRequestOptions { * @interface TransactionsSyncResponse */ export interface TransactionsSyncResponse { - [key: string]: object | unknown; /** * Transactions that have been added to the Item since `cursor` ordered by ascending last modified time. * @type {Array} @@ -36640,7 +36024,6 @@ export interface TransactionsUserInsightsGetRequest { * @interface TransactionsUserInsightsGetResponse */ export interface TransactionsUserInsightsGetResponse { - [key: string]: object | unknown; /** * * @type {UserDataOverview} @@ -36672,7 +36055,6 @@ export interface TransactionsUserInsightsGetResponse { * @interface Transfer */ export interface Transfer { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a transfer. * @type {string} @@ -36873,7 +36255,6 @@ export declare enum TransferACHNetwork { * @interface TransferAuthorization */ export interface TransferAuthorization { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a transfer authorization. * @type {string} @@ -37064,7 +36445,6 @@ export interface TransferAuthorizationCreateRequest { * @interface TransferAuthorizationCreateResponse */ export interface TransferAuthorizationCreateResponse { - [key: string]: object | unknown; /** * * @type {TransferAuthorization} @@ -37093,7 +36473,6 @@ export declare enum TransferAuthorizationDecision { * @interface TransferAuthorizationDecisionRationale */ export interface TransferAuthorizationDecisionRationale { - [key: string]: object | unknown; /** * * @type {TransferAuthorizationDecisionRationaleCode} @@ -37129,7 +36508,6 @@ export declare enum TransferAuthorizationDecisionRationaleCode { * @interface TransferAuthorizationDevice */ export interface TransferAuthorizationDevice { - [key: string]: object | unknown; /** * The IP address of the device being used to initiate the authorization. * @type {string} @@ -37159,7 +36537,6 @@ export declare enum TransferAuthorizationGuaranteeDecision { * @interface TransferAuthorizationGuaranteeDecisionRationale */ export interface TransferAuthorizationGuaranteeDecisionRationale { - [key: string]: object | unknown; /** * * @type {TransferAuthorizationGuaranteeDecisionRationaleCode} @@ -37191,7 +36568,6 @@ export declare enum TransferAuthorizationGuaranteeDecisionRationaleCode { * @interface TransferAuthorizationPaymentRisk */ export interface TransferAuthorizationPaymentRisk { - [key: string]: object | unknown; /** * A score from 1-99 that indicates the transaction return risk: a higher risk score suggests a higher return likelihood. The score evaluates the transaction return risk because an account is overdrawn or because an ineligible account is used and covers return codes: \"R01\", \"R02\", \"R03\", \"R04\", \"R06\", \"R08\", \"R09\", \"R13\", \"R16\", \"R17\", \"R20\", \"R23\". These returns have a turnaround time of 2 banking days. * @type {number} @@ -37223,7 +36599,6 @@ export interface TransferAuthorizationPaymentRisk { * @interface TransferAuthorizationProposedTransfer */ export interface TransferAuthorizationProposedTransfer { - [key: string]: object | unknown; /** * * @type {ACHClass} @@ -37342,7 +36717,6 @@ export interface TransferAuthorizationUserInRequest { * @interface TransferBalance */ export interface TransferBalance { - [key: string]: object | unknown; /** * The amount of this balance available for use (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} @@ -37400,7 +36774,6 @@ export interface TransferBalanceGetRequest { * @interface TransferBalanceGetResponse */ export interface TransferBalanceGetResponse { - [key: string]: object | unknown; /** * * @type {TransferBalance} @@ -37461,7 +36834,6 @@ export interface TransferCancelRequest { * @interface TransferCancelResponse */ export interface TransferCancelResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -37475,7 +36847,6 @@ export interface TransferCancelResponse { * @interface TransferCapabilitiesGetRTP */ export interface TransferCapabilitiesGetRTP { - [key: string]: object | unknown; /** * When `true`, the linked Item\'s institution supports RTP credit transfer. * @type {boolean} @@ -37526,7 +36897,6 @@ export interface TransferCapabilitiesGetRequest { * @interface TransferCapabilitiesGetResponse */ export interface TransferCapabilitiesGetResponse { - [key: string]: object | unknown; /** * * @type {InstitutionSupportedNetworks} @@ -37571,7 +36941,6 @@ export interface TransferConfigurationGetRequest { * @interface TransferConfigurationGetResponse */ export interface TransferConfigurationGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -37759,7 +37128,6 @@ export interface TransferCreateRequest { * @interface TransferCreateResponse */ export interface TransferCreateResponse { - [key: string]: object | unknown; /** * * @type {Transfer} @@ -37864,7 +37232,6 @@ export interface TransferDebitUsageConfiguration { * @interface TransferDevice */ export interface TransferDevice { - [key: string]: object | unknown; /** * The IP address of the device being used to initiate the authorization. * @type {string} @@ -37909,7 +37276,6 @@ export interface TransferDiligenceDocumentUploadRequest { * @interface TransferDiligenceDocumentUploadResponse */ export interface TransferDiligenceDocumentUploadResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -37966,7 +37332,6 @@ export interface TransferDiligenceSubmitRequest { * @interface TransferDiligenceSubmitResponse */ export interface TransferDiligenceSubmitResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -37988,7 +37353,6 @@ export declare enum TransferDocumentPurpose { * @interface TransferEvent */ export interface TransferEvent { - [key: string]: object | unknown; /** * Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers. * @type {number} @@ -38173,7 +37537,6 @@ export interface TransferEventListRequest { * @interface TransferEventListResponse */ export interface TransferEventListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -38234,7 +37597,6 @@ export interface TransferEventSyncRequest { * @interface TransferEventSyncResponse */ export interface TransferEventSyncResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -38275,7 +37637,6 @@ export declare enum TransferEventType { * @interface TransferEventsUpdateWebhook */ export interface TransferEventsUpdateWebhook { - [key: string]: object | unknown; /** * `TRANSFER` * @type {string} @@ -38301,7 +37662,6 @@ export interface TransferEventsUpdateWebhook { * @interface TransferExpectedSweepSettlementScheduleItem */ export interface TransferExpectedSweepSettlementScheduleItem { - [key: string]: object | unknown; /** * The settlement date of a sweep for this transfer. * @type {string} @@ -38321,7 +37681,6 @@ export interface TransferExpectedSweepSettlementScheduleItem { * @interface TransferFailure */ export interface TransferFailure { - [key: string]: object | unknown; /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the transfer status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). * @type {string} @@ -38392,7 +37751,6 @@ export interface TransferGetRequest { * @interface TransferGetResponse */ export interface TransferGetResponse { - [key: string]: object | unknown; /** * * @type {Transfer} @@ -38421,7 +37779,6 @@ export declare enum TransferIntentAuthorizationDecision { * @interface TransferIntentCreate */ export interface TransferIntentCreate { - [key: string]: object | unknown; /** * Plaid\'s unique identifier for the transfer intent object. * @type {string} @@ -38634,7 +37991,6 @@ export interface TransferIntentCreateRequest { * @interface TransferIntentCreateResponse */ export interface TransferIntentCreateResponse { - [key: string]: object | unknown; /** * * @type {TransferIntentCreate} @@ -38654,7 +38010,6 @@ export interface TransferIntentCreateResponse { * @interface TransferIntentGet */ export interface TransferIntentGet { - [key: string]: object | unknown; /** * Plaid\'s unique identifier for a transfer intent object. * @type {string} @@ -38791,7 +38146,6 @@ export interface TransferIntentGet { * @interface TransferIntentGetFailureReason */ export interface TransferIntentGetFailureReason { - [key: string]: object | unknown; /** * A broad categorization of the error. * @type {string} @@ -38817,7 +38171,6 @@ export interface TransferIntentGetFailureReason { * @interface TransferIntentGetRequest */ export interface TransferIntentGetRequest { - [key: string]: object | unknown; /** * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. * @type {string} @@ -38843,7 +38196,6 @@ export interface TransferIntentGetRequest { * @interface TransferIntentGetResponse */ export interface TransferIntentGetResponse { - [key: string]: object | unknown; /** * * @type {TransferIntentGet} @@ -38873,7 +38225,6 @@ export declare enum TransferIntentStatus { * @interface TransferLedgerBalance */ export interface TransferLedgerBalance { - [key: string]: object | unknown; /** * The amount of this balance available for use (decimal string with two digits of precision e.g. \"10.00\"). * @type {string} @@ -38948,7 +38299,6 @@ export interface TransferLedgerDepositRequest { * @interface TransferLedgerDepositResponse */ export interface TransferLedgerDepositResponse { - [key: string]: object | unknown; /** * * @type {TransferSweep} @@ -39017,7 +38367,6 @@ export interface TransferLedgerDistributeRequest { * @interface TransferLedgerDistributeResponse */ export interface TransferLedgerDistributeResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39056,7 +38405,6 @@ export interface TransferLedgerGetRequest { * @interface TransferLedgerGetResponse */ export interface TransferLedgerGetResponse { - [key: string]: object | unknown; /** * * @type {TransferLedgerBalance} @@ -39142,7 +38490,6 @@ export interface TransferLedgerWithdrawRequest { * @interface TransferLedgerWithdrawResponse */ export interface TransferLedgerWithdrawResponse { - [key: string]: object | unknown; /** * * @type {TransferSweep} @@ -39224,7 +38571,6 @@ export interface TransferListRequest { * @interface TransferListResponse */ export interface TransferListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -39269,7 +38615,6 @@ export interface TransferMetricsGetRequest { * @interface TransferMetricsGetResponse */ export interface TransferMetricsGetResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39363,7 +38708,6 @@ export interface TransferMigrateAccountRequest { * @interface TransferMigrateAccountResponse */ export interface TransferMigrateAccountResponse { - [key: string]: object | unknown; /** * The Plaid `access_token` for the newly created Item. * @type {string} @@ -39461,7 +38805,6 @@ export interface TransferOriginatorCreateRequest { * @interface TransferOriginatorCreateResponse */ export interface TransferOriginatorCreateResponse { - [key: string]: object | unknown; /** * Client ID of the originator. This identifier will be used when creating transfers and should be stored associated with end user information. * @type {string} @@ -39573,7 +38916,6 @@ export interface TransferOriginatorFundingAccountUpdateRequest { * @interface TransferOriginatorFundingAccountUpdateResponse */ export interface TransferOriginatorFundingAccountUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39612,7 +38954,6 @@ export interface TransferOriginatorGetRequest { * @interface TransferOriginatorGetResponse */ export interface TransferOriginatorGetResponse { - [key: string]: object | unknown; /** * * @type {DetailedOriginator} @@ -39663,7 +39004,6 @@ export interface TransferOriginatorListRequest { * @interface TransferOriginatorListResponse */ export interface TransferOriginatorListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -39714,7 +39054,6 @@ export interface TransferQuestionnaireCreateRequest { * @interface TransferQuestionnaireCreateResponse */ export interface TransferQuestionnaireCreateResponse { - [key: string]: object | unknown; /** * Plaid-hosted onboarding URL that you will redirect the end customer to. * @type {string} @@ -39759,7 +39098,6 @@ export interface TransferRecurringCancelRequest { * @interface TransferRecurringCancelResponse */ export interface TransferRecurringCancelResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -39884,7 +39222,6 @@ export interface TransferRecurringCreateRequest { * @interface TransferRecurringCreateResponse */ export interface TransferRecurringCreateResponse { - [key: string]: object | unknown; /** * * @type {RecurringTransferNullable} @@ -39941,7 +39278,6 @@ export interface TransferRecurringGetRequest { * @interface TransferRecurringGetResponse */ export interface TransferRecurringGetResponse { - [key: string]: object | unknown; /** * * @type {RecurringTransfer} @@ -40010,7 +39346,6 @@ export interface TransferRecurringListRequest { * @interface TransferRecurringListResponse */ export interface TransferRecurringListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -40077,7 +39412,6 @@ export declare enum TransferRecurringStatus { * @interface TransferRefund */ export interface TransferRefund { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a refund. * @type {string} @@ -40152,7 +39486,6 @@ export interface TransferRefundCancelRequest { * @interface TransferRefundCancelResponse */ export interface TransferRefundCancelResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -40203,7 +39536,6 @@ export interface TransferRefundCreateRequest { * @interface TransferRefundCreateResponse */ export interface TransferRefundCreateResponse { - [key: string]: object | unknown; /** * * @type {TransferRefund} @@ -40223,7 +39555,6 @@ export interface TransferRefundCreateResponse { * @interface TransferRefundFailure */ export interface TransferRefundFailure { - [key: string]: object | unknown; /** * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). * @type {string} @@ -40268,7 +39599,6 @@ export interface TransferRefundGetRequest { * @interface TransferRefundGetResponse */ export interface TransferRefundGetResponse { - [key: string]: object | unknown; /** * * @type {TransferRefund} @@ -40301,7 +39631,6 @@ export declare enum TransferRefundStatus { * @interface TransferRepayment */ export interface TransferRepayment { - [key: string]: object | unknown; /** * Identifier of the repayment. * @type {string} @@ -40376,7 +39705,6 @@ export interface TransferRepaymentListRequest { * @interface TransferRepaymentListResponse */ export interface TransferRepaymentListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -40396,7 +39724,6 @@ export interface TransferRepaymentListResponse { * @interface TransferRepaymentReturn */ export interface TransferRepaymentReturn { - [key: string]: object | unknown; /** * The unique identifier of the guaranteed transfer that was returned. * @type {string} @@ -40465,7 +39792,6 @@ export interface TransferRepaymentReturnListRequest { * @interface TransferRepaymentReturnListResponse */ export interface TransferRepaymentReturnListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -40507,7 +39833,6 @@ export declare enum TransferStatus { * @interface TransferSweep */ export interface TransferSweep { - [key: string]: object | unknown; /** * Identifier of the sweep. * @type {string} @@ -40600,7 +39925,6 @@ export interface TransferSweepGetRequest { * @interface TransferSweepGetResponse */ export interface TransferSweepGetResponse { - [key: string]: object | unknown; /** * * @type {TransferSweep} @@ -40699,7 +40023,6 @@ export interface TransferSweepListRequest { * @interface TransferSweepListResponse */ export interface TransferSweepListResponse { - [key: string]: object | unknown; /** * * @type {Array} @@ -40731,7 +40054,6 @@ export declare enum TransferSweepStatus { * @interface TransferTestClock */ export interface TransferTestClock { - [key: string]: object | unknown; /** * Plaid’s unique identifier for a test clock. * @type {string} @@ -40797,7 +40119,6 @@ export interface TransferUserAddressInRequest { * @interface TransferUserAddressInResponse */ export interface TransferUserAddressInResponse { - [key: string]: object | unknown; /** * The street number and name (i.e., \"100 Market St.\"). * @type {string} @@ -40897,7 +40218,6 @@ export interface TransferUserInRequestDeprecated { * @interface TransferUserInResponse */ export interface TransferUserInResponse { - [key: string]: object | unknown; /** * The user\'s legal name. * @type {string} @@ -41015,7 +40335,6 @@ export interface UpdateIndividualScreeningRequestSearchTerms { * @interface UserAccountRevokedWebhook */ export interface UserAccountRevokedWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -41059,7 +40378,6 @@ export interface UserAccountRevokedWebhook { * @interface UserAddress */ export interface UserAddress { - [key: string]: object | unknown; /** * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} @@ -41134,7 +40452,6 @@ export interface UserCreateRequest { * @interface UserCreateResponse */ export interface UserCreateResponse { - [key: string]: object | unknown; /** * The user token associated with the User data is being requested for. * @type {string} @@ -41160,7 +40477,6 @@ export interface UserCreateResponse { * @interface UserCustomPassword */ export interface UserCustomPassword { - [key: string]: object | unknown; /** * The version of the password schema to use, possible values are 1 or 2. The default value is 2. You should only specify 1 if you know it is necessary for your test suite. * @type {string} @@ -41204,7 +40520,6 @@ export interface UserCustomPassword { * @interface UserDataOverview */ export interface UserDataOverview { - [key: string]: object | unknown; /** * The total number of transactions. * @type {number} @@ -41248,7 +40563,6 @@ export interface UserDataOverview { * @interface UserIDNumber */ export interface UserIDNumber { - [key: string]: object | unknown; /** * Value of identity document value typed in by user. Alpha-numeric, with all formatting characters stripped. * @type {string} @@ -41268,7 +40582,6 @@ export interface UserIDNumber { * @interface UserPermissionRevokedWebhook */ export interface UserPermissionRevokedWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -41377,7 +40690,6 @@ export interface UserUpdateRequest { * @interface UserUpdateResponse */ export interface UserUpdateResponse { - [key: string]: object | unknown; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -41391,7 +40703,6 @@ export interface UserUpdateResponse { * @interface ValidationSource */ export interface ValidationSource { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {string} @@ -41411,7 +40722,6 @@ export interface ValidationSource { * @interface ValidationSources */ export interface ValidationSources { - [key: string]: object | unknown; /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @type {Array} @@ -41425,7 +40735,6 @@ export interface ValidationSources { * @interface VerificationExpiredWebhook */ export interface VerificationExpiredWebhook { - [key: string]: object | unknown; /** * `AUTH` * @type {string} @@ -41469,7 +40778,6 @@ export interface VerificationExpiredWebhook { * @interface VerificationOfAsset */ export interface VerificationOfAsset { - [key: string]: object | unknown; /** * * @type {ReportingInformation} @@ -41495,7 +40803,6 @@ export interface VerificationOfAsset { * @interface VerificationOfAssetResponse */ export interface VerificationOfAssetResponse { - [key: string]: object | unknown; /** * * @type {Assets} @@ -41531,7 +40838,6 @@ export declare enum VerificationStatus { * @interface W2 */ export interface W2 { - [key: string]: object | unknown; /** * * @type {PaystubEmployer} @@ -41665,7 +40971,6 @@ export interface W2 { * @interface W2Box12 */ export interface W2Box12 { - [key: string]: object | unknown; /** * W2 Box 12 code. * @type {string} @@ -41685,7 +40990,6 @@ export interface W2Box12 { * @interface W2StateAndLocalWages */ export interface W2StateAndLocalWages { - [key: string]: object | unknown; /** * State associated with the wage. * @type {string} @@ -41735,7 +41039,6 @@ export interface W2StateAndLocalWages { * @interface Wallet */ export interface Wallet { - [key: string]: object | unknown; /** * A unique ID identifying the e-wallet * @type {string} @@ -41773,7 +41076,6 @@ export interface Wallet { * @interface WalletBalance */ export interface WalletBalance { - [key: string]: object | unknown; /** * The ISO-4217 currency code of the balance * @type {string} @@ -41981,7 +41283,6 @@ export interface WalletListRequest { * @interface WalletListResponse */ export interface WalletListResponse { - [key: string]: object | unknown; /** * An array of e-wallets * @type {Array} @@ -42007,7 +41308,6 @@ export interface WalletListResponse { * @interface WalletNumbers */ export interface WalletNumbers { - [key: string]: object | unknown; /** * * @type {RecipientBACS} @@ -42048,7 +41348,6 @@ export declare enum WalletStatus { * @interface WalletTransaction */ export interface WalletTransaction { - [key: string]: object | unknown; /** * A unique ID identifying the transaction * @type {string} @@ -42140,7 +41439,6 @@ export declare enum WalletTransactionTypeEnum { * @interface WalletTransactionAmount */ export interface WalletTransactionAmount { - [key: string]: object | unknown; /** * * @type {WalletISOCurrencyCode} @@ -42160,7 +41458,6 @@ export interface WalletTransactionAmount { * @interface WalletTransactionCounterparty */ export interface WalletTransactionCounterparty { - [key: string]: object | unknown; /** * The name of the counterparty * @type {string} @@ -42211,7 +41508,6 @@ export interface WalletTransactionCounterpartyBACS { * @interface WalletTransactionCounterpartyInternational */ export interface WalletTransactionCounterpartyInternational { - [key: string]: object | unknown; /** * International Bank Account Number (IBAN). * @type {string} @@ -42225,7 +41521,6 @@ export interface WalletTransactionCounterpartyInternational { * @interface WalletTransactionCounterpartyNumbers */ export interface WalletTransactionCounterpartyNumbers { - [key: string]: object | unknown; /** * * @type {WalletTransactionCounterpartyBACS} @@ -42294,7 +41589,6 @@ export interface WalletTransactionExecuteRequest { * @interface WalletTransactionExecuteResponse */ export interface WalletTransactionExecuteResponse { - [key: string]: object | unknown; /** * A unique ID identifying the transaction * @type {string} @@ -42516,7 +41810,6 @@ export interface WalletTransactionListRequestOptions { * @interface WalletTransactionListResponse */ export interface WalletTransactionListResponse { - [key: string]: object | unknown; /** * An array of transactions of an e-wallet, associated with the given `wallet_id` * @type {Array} @@ -42555,7 +41848,6 @@ export declare enum WalletTransactionStatus { * @interface WalletTransactionStatusUpdateWebhook */ export interface WalletTransactionStatusUpdateWebhook { - [key: string]: object | unknown; /** * `WALLET` * @type {string} @@ -42660,7 +41952,6 @@ export interface WalletTransactionsListRequest { * @interface Warning */ export interface Warning { - [key: string]: object | unknown; /** * The warning type, which will always be `ASSET_REPORT_WARNING` * @type {string} @@ -42695,7 +41986,6 @@ export declare enum WarningWarningCodeEnum { * @interface WatchlistScreeningAuditTrail */ export interface WatchlistScreeningAuditTrail { - [key: string]: object | unknown; /** * * @type {Source} @@ -42721,7 +42011,6 @@ export interface WatchlistScreeningAuditTrail { * @interface WatchlistScreeningDocument */ export interface WatchlistScreeningDocument { - [key: string]: object | unknown; /** * * @type {WatchlistScreeningDocumentType} @@ -42792,7 +42081,6 @@ export interface WatchlistScreeningEntityCreateRequest { * @interface WatchlistScreeningEntityCreateResponse */ export interface WatchlistScreeningEntityCreateResponse { - [key: string]: object | unknown; /** * ID of the associated entity screening. * @type {string} @@ -42867,7 +42155,6 @@ export interface WatchlistScreeningEntityGetRequest { * @interface WatchlistScreeningEntityGetResponse */ export interface WatchlistScreeningEntityGetResponse { - [key: string]: object | unknown; /** * ID of the associated entity screening. * @type {string} @@ -42948,7 +42235,6 @@ export interface WatchlistScreeningEntityHistoryListRequest { * @interface WatchlistScreeningEntityHistoryListResponse */ export interface WatchlistScreeningEntityHistoryListResponse { - [key: string]: object | unknown; /** * List of entity watchlist screening * @type {Array} @@ -43005,7 +42291,6 @@ export interface WatchlistScreeningEntityHitListRequest { * @interface WatchlistScreeningEntityHitListResponse */ export interface WatchlistScreeningEntityHitListResponse { - [key: string]: object | unknown; /** * List of entity watchlist screening hits * @type {Array} @@ -43080,7 +42365,6 @@ export interface WatchlistScreeningEntityListRequest { * @interface WatchlistScreeningEntityListResponse */ export interface WatchlistScreeningEntityListResponse { - [key: string]: object | unknown; /** * List of entity watchlist screening * @type {Array} @@ -43131,7 +42415,6 @@ export interface WatchlistScreeningEntityProgramGetRequest { * @interface WatchlistScreeningEntityProgramGetResponse */ export interface WatchlistScreeningEntityProgramGetResponse { - [key: string]: object | unknown; /** * ID of the associated entity program. * @type {string} @@ -43218,7 +42501,6 @@ export interface WatchlistScreeningEntityProgramListRequest { * @interface WatchlistScreeningEntityProgramListResponse */ export interface WatchlistScreeningEntityProgramListResponse { - [key: string]: object | unknown; /** * List of entity watchlist screening programs * @type {Array} @@ -43287,7 +42569,6 @@ export interface WatchlistScreeningEntityReviewCreateRequest { * @interface WatchlistScreeningEntityReviewCreateResponse */ export interface WatchlistScreeningEntityReviewCreateResponse { - [key: string]: object | unknown; /** * ID of the associated entity review. * @type {string} @@ -43362,7 +42643,6 @@ export interface WatchlistScreeningEntityReviewListRequest { * @interface WatchlistScreeningEntityReviewListResponse */ export interface WatchlistScreeningEntityReviewListResponse { - [key: string]: object | unknown; /** * List of entity watchlist screening reviews * @type {Array} @@ -43451,7 +42731,6 @@ export declare enum WatchlistScreeningEntityUpdateRequestResettableField { * @interface WatchlistScreeningEntityUpdateResponse */ export interface WatchlistScreeningEntityUpdateResponse { - [key: string]: object | unknown; /** * ID of the associated entity screening. * @type {string} @@ -43501,7 +42780,6 @@ export interface WatchlistScreeningEntityUpdateResponse { * @interface WatchlistScreeningHit */ export interface WatchlistScreeningHit { - [key: string]: object | unknown; /** * ID of the associated screening hit. * @type {string} @@ -43569,7 +42847,6 @@ export interface WatchlistScreeningHit { * @interface WatchlistScreeningHitLocations */ export interface WatchlistScreeningHitLocations { - [key: string]: object | unknown; /** * The full location string, potentially including elements like street, city, postal codes and country codes. Note that this is not necessarily a complete or well-formatted address. * @type {string} @@ -43599,7 +42876,6 @@ export declare enum WatchlistScreeningHitStatus { * @interface WatchlistScreeningIndividual */ export interface WatchlistScreeningIndividual { - [key: string]: object | unknown; /** * ID of the associated screening. * @type {string} @@ -43674,7 +42950,6 @@ export interface WatchlistScreeningIndividualCreateRequest { * @interface WatchlistScreeningIndividualCreateResponse */ export interface WatchlistScreeningIndividualCreateResponse { - [key: string]: object | unknown; /** * ID of the associated screening. * @type {string} @@ -43749,7 +43024,6 @@ export interface WatchlistScreeningIndividualGetRequest { * @interface WatchlistScreeningIndividualGetResponse */ export interface WatchlistScreeningIndividualGetResponse { - [key: string]: object | unknown; /** * ID of the associated screening. * @type {string} @@ -43830,7 +43104,6 @@ export interface WatchlistScreeningIndividualHistoryListRequest { * @interface WatchlistScreeningIndividualHistoryListResponse */ export interface WatchlistScreeningIndividualHistoryListResponse { - [key: string]: object | unknown; /** * List of individual watchlist screenings * @type {Array} @@ -43887,7 +43160,6 @@ export interface WatchlistScreeningIndividualHitListRequest { * @interface WatchlistScreeningIndividualHitListResponse */ export interface WatchlistScreeningIndividualHitListResponse { - [key: string]: object | unknown; /** * List of individual watchlist screening hits * @type {Array} @@ -43962,7 +43234,6 @@ export interface WatchlistScreeningIndividualListRequest { * @interface WatchlistScreeningIndividualListResponse */ export interface WatchlistScreeningIndividualListResponse { - [key: string]: object | unknown; /** * List of individual watchlist screenings * @type {Array} @@ -44013,7 +43284,6 @@ export interface WatchlistScreeningIndividualProgramGetRequest { * @interface WatchlistScreeningIndividualProgramGetResponse */ export interface WatchlistScreeningIndividualProgramGetResponse { - [key: string]: object | unknown; /** * ID of the associated program. * @type {string} @@ -44100,7 +43370,6 @@ export interface WatchlistScreeningIndividualProgramListRequest { * @interface WatchlistScreeningIndividualProgramListResponse */ export interface WatchlistScreeningIndividualProgramListResponse { - [key: string]: object | unknown; /** * List of individual watchlist screening programs * @type {Array} @@ -44169,7 +43438,6 @@ export interface WatchlistScreeningIndividualReviewCreateRequest { * @interface WatchlistScreeningIndividualReviewCreateResponse */ export interface WatchlistScreeningIndividualReviewCreateResponse { - [key: string]: object | unknown; /** * ID of the associated review. * @type {string} @@ -44244,7 +43512,6 @@ export interface WatchlistScreeningIndividualReviewListRequest { * @interface WatchlistScreeningIndividualReviewListResponse */ export interface WatchlistScreeningIndividualReviewListResponse { - [key: string]: object | unknown; /** * List of screening reviews * @type {Array} @@ -44333,7 +43600,6 @@ export declare enum WatchlistScreeningIndividualUpdateRequestResettableField { * @interface WatchlistScreeningIndividualUpdateResponse */ export interface WatchlistScreeningIndividualUpdateResponse { - [key: string]: object | unknown; /** * ID of the associated screening. * @type {string} @@ -44420,7 +43686,6 @@ export interface WatchlistScreeningRequestSearchTerms { * @interface WatchlistScreeningReview */ export interface WatchlistScreeningReview { - [key: string]: object | unknown; /** * ID of the associated review. * @type {string} @@ -44458,7 +43723,6 @@ export interface WatchlistScreeningReview { * @interface WatchlistScreeningSearchTerms */ export interface WatchlistScreeningSearchTerms { - [key: string]: object | unknown; /** * ID of the associated program. * @type {string} @@ -44546,7 +43810,6 @@ export declare enum WebhookType { * @interface WebhookUpdateAcknowledgedWebhook */ export interface WebhookUpdateAcknowledgedWebhook { - [key: string]: object | unknown; /** * `ITEM` * @type {string} @@ -44615,7 +43878,6 @@ export interface WebhookVerificationKeyGetRequest { * @interface WebhookVerificationKeyGetResponse */ export interface WebhookVerificationKeyGetResponse { - [key: string]: object | unknown; /** * * @type {JWKPublicKey} diff --git a/dist/api.js b/dist/api.js index f04942be..bec55374 100644 --- a/dist/api.js +++ b/dist/api.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -20939,4 +20939,4 @@ class PlaidApi extends base_1.BaseAPI { } } exports.PlaidApi = PlaidApi; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDZixDQUFDLEVBTFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFLbkI7QUFxQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQStIRDs7O01BR007QUFDTixJQUFZLG1DQVFYO0FBUkQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7SUFDMUMsMkVBQW9DLENBQUE7QUFDeEMsQ0FBQyxFQVJXLG1DQUFtQyxHQUFuQywyQ0FBbUMsS0FBbkMsMkNBQW1DLFFBUTlDO0FBNkpEOzs7TUFHTTtBQUNOLElBQVksaUNBUVg7QUFSRCxXQUFZLGlDQUFpQztJQUN6QyxxRkFBZ0QsQ0FBQTtJQUNoRCxvR0FBK0QsQ0FBQTtJQUMvRCw4RkFBeUQsQ0FBQTtJQUN6RCwyRUFBc0MsQ0FBQTtJQUN0Qyxp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QyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQXA4RkQsNEJBbzhGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4NS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlLmcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBUZWwgPSAndGVsJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBBUFIgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFQUlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW5udWFsIFBlcmNlbnRhZ2UgUmF0ZSBhcHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBhcHJfcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGJhbGFuY2UgdG8gd2hpY2ggdGhlIEFQUiBhcHBsaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl90eXBlOiBBUFJBcHJUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbW9uZXkgdGhhdCBpcyBzdWJqZWN0ZWQgdG8gdGhlIEFQUiBpZiBhIGJhbGFuY2Ugd2FzIGNhcnJpZWQgYmV5b25kIHBheW1lbnQgZHVlIGRhdGUuIEhvdyBpdCBpcyBjYWxjdWxhdGVkIGNhbiB2YXJ5IGJ5IGNhcmQgaXNzdWVyLiBJdCBpcyBvZnRlbiBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2UgZGFpbHkgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBiYWxhbmNlX3N1YmplY3RfdG9fYXByOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSBjaGFyZ2VkIGR1ZSB0byBpbnRlcmVzdCBmcm9tIGxhc3Qgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGludGVyZXN0X2NoYXJnZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQVBSQXByVHlwZUVudW0ge1xuICAgIEJhbGFuY2VUcmFuc2ZlckFwciA9ICdiYWxhbmNlX3RyYW5zZmVyX2FwcicsXG4gICAgQ2FzaEFwciA9ICdjYXNoX2FwcicsXG4gICAgUHVyY2hhc2VBcHIgPSAncHVyY2hhc2VfYXByJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnXG59XG5cbi8qKlxuICogQWxsb3cgb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYnkgYWNjb3VudC4gVW5saXN0ZWQgKGUuZy4gbWlzc2luZykgYWNjb3VudHMgd2lsbCBiZSBjb25zaWRlcmVkIGBuZXdfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QWNjZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMgIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0SW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBc3NldHNBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM/OiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlPzogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM/OiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LiBCYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSBiYWxhbmNlIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBBdXRvbWF0ZWQgb3IgTWFudWFsIG1pY3JvLWRlcG9zaXRzLiAgUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSBhY2NvdW50IHN1YnR5cGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyBmb3IgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byBzZWxlY3QgZnJvbS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBQbGFpZCBkb2N1bWVudGF0aW9uIG9uIGFjY291bnQgZmlsdGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgYGFjY291bnRfZmlsdGVyc2Agc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IERlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIElkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnRzIHRoYXQgaWRlbnRpdHkgZGF0YSBpcyBkZXJ2aWVkIGZyb20uIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiBub25lIG9mIHRoZSBhY2NvdW50IGlkZW50aXR5IGlzIGZyb20gYSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnQ+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnRzIHRoYXQgaWRlbnRpdHkgZGF0YSBpcyBkZXJ2aWVkIGZyb20uIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiBub25lIG9mIHRoZSBhY2NvdW50IGlkZW50aXR5IGlzIGZyb20gYSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudD47XG59XG4vKipcbiAqIElkZW50aXR5IG1hdGNoIHNjb3JlcyBmb3IgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05hbWVNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0YXggZG9jdW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IGFjY291bnRzIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBjYXJkaW5hbGl0eS4gYE1VTFRJX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgbXVsdGlwbGUgYWNjb3VudHMuIGBTSU5HTEVfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBvbmx5IGEgc2luZ2xlIGFjY291bnQuIGBBTExgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBtdXN0IHNoYXJlIGFsbCBvZiB0aGVpciBhY2NvdW50cyBhbmQgc2hvdWxkIG5vdCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gZGUtc2VsZWN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U2VsZWN0aW9uQ2FyZGluYWxpdHkge1xuICAgIFNpbmdsZVNlbGVjdCA9ICdTSU5HTEVfU0VMRUNUJyxcbiAgICBNdWx0aVNlbGVjdCA9ICdNVUxUSV9TRUxFQ1QnLFxuICAgIEFsbCA9ICdBTEwnXG59XG5cbi8qKlxuICogU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFN1YnR5cGUge1xuICAgIF80MDFhID0gJzQwMWEnLFxuICAgIF80MDFrID0gJzQwMWsnLFxuICAgIF80MDNCID0gJzQwM0InLFxuICAgIF80NTdiID0gJzQ1N2InLFxuICAgIF81MjkgPSAnNTI5JyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE5vbkN1c3RvZGlhbFdhbGxldCA9ICdub24tY3VzdG9kaWFsIHdhbGxldCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBSZWN1cnJpbmcgPSAncmVjdXJyaW5nJyxcbiAgICBSZXdhcmRzID0gJ3Jld2FyZHMnLFxuICAgIFNhZmVEZXBvc2l0ID0gJ3NhZmUgZGVwb3NpdCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgIGluc3RlYWQuICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFR5cGUge1xuICAgIEludmVzdG1lbnQgPSAnaW52ZXN0bWVudCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9kZXRhaWxzPzogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGZvciBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgcGF5bWVudCBkZXRhaWxzLiBJZiBzZXQsIGEgcGF5bWVudCByaXNrIGFzc2Vzc21lbnQgaXMgcGVyZm9ybWVkIGFuZCByZXR1cm5lZCBhcyBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhyZXNob2xkIHBlcmNlbnRhZ2Ugb2YgdGhlIGFjY291bnQgYmFsYW5jZSB1c2VkIGZvciBjb21wYXJpc29uIHdpdGggdGhlIHJlcXVlc3RlZCBBQ0ggZGViaXQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG4vKipcbiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGRldGFpbGVkIHJpc2sgYXNzZXNzbWVudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGZpdmUtdGllciByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgcmV0dXJuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdGVkIEFDSCBkZWJpdCBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgKHNldCBieSBjdXN0b21lcnMpIG9mIHRoZSBhdmFpbGFibGUgb3IgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnR9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Jpc2tfYXNzZXNzbWVudD86IEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24vYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpb25TdGF0ZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBBdHRlbXB0ID0gJ0FUVEVNUFQnLFxuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgICBTa2lwcGVkID0gJ1NLSVBQRUQnXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgY29uc2VudCBhY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWN0aXZpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aXZpdHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGFjdGl2aXR5OiBBY3Rpdml0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhY3Rpdml0eSB3YXMgaW5pdGlhdGVkIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdGVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWN0aXZpdHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXBwbGljYXRpb24gSUQgb2YgdGhlIGNsaWVudCB3aG8gaW5pdGlhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpb25TdGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzdGF0ZTogQWN0aW9uU3RhdGU7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHRhcmdldF9hcHBsaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUeXBlcyBvZiBjb25zZW50IGFjdGl2aXRpZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjdGl2aXR5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBJdGVtQ3JlYXRlID0gJ0lURU1fQ1JFQVRFJyxcbiAgICBJdGVtSW1wb3J0ID0gJ0lURU1fSU1QT1JUJyxcbiAgICBJdGVtVXBkYXRlID0gJ0lURU1fVVBEQVRFJyxcbiAgICBJdGVtVW5saW5rID0gJ0lURU1fVU5MSU5LJyxcbiAgICBQb3J0YWxVbmxpbmsgPSAnUE9SVEFMX1VOTElOSycsXG4gICAgUG9ydGFsSXRlbXNEZWxldGUgPSAnUE9SVEFMX0lURU1TX0RFTEVURScsXG4gICAgSXRlbVJlbW92ZSA9ICdJVEVNX1JFTU9WRScsXG4gICAgSW52YXJpYW50Q2hlY2tlckRlbGV0aW9uID0gJ0lOVkFSSUFOVF9DSEVDS0VSX0RFTEVUSU9OJyxcbiAgICBTY29wZXNVcGRhdGUgPSAnU0NPUEVTX1VQREFURSdcbn1cblxuLyoqXG4gKiBBIHBoeXNpY2FsIG1haWxpbmcgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIGRhdGE6IEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGFkZHJlc3Mgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBpcyBiZWluZyB1c2VkIGZvciBjb21tZXJjaWFsIG9yIHJlc2lkZW50aWFsIHB1cnBvc2VzLiAgTm90ZTogVGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYCB3aGVuIFBsYWlkIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGRldGVybWluZSB0aGUgYWRkcmVzc1xcJ3MgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc1B1cnBvc2VMYWJlbCB7XG4gICAgUmVzaWRlbnRpYWwgPSAncmVzaWRlbnRpYWwnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFwcGxpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGdyYW50ZWQgcHJvZHVjdGlvbiBhY2Nlc3MgYXQgUGxhaWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBqb2luX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIGNsaWVudOKAmXMgYnJvYWQgdXNlIGNhc2UgYXMgYXNzZXNzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VfY2FzZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgY2xpZW504oCZcyBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb21wYW55X2xlZ2FsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjaXR5IG9mIHRoZSBjbGllbnTigJlzIGhlYWRxdWFydGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZWdpb24gb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zdGFsIGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgc2NoZW1hIGZvciBgL2FwcGxpY2F0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXREZXRhaWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdG9yX2lkYCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRvcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIFRoZSBgYXNzZXRzYCBwcm9kdWN0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIGxpbms7IHRoZSBBc3NldHMgcHJvZHVjdCBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuIElmIHVzaW5nIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR5LCBgZGF5c19yZXF1ZXN0ZWRgIG11c3QgYmUgYXQgbGVhc3QgNjEgZm9yIG5ldyBvcmlnaW5hdGlvbnMgb3IgYXQgbGVhc3QgMzEgZm9yIHJlZmluYW5jaW5ncy4gIEFuIEFzc2V0IFJlcG9ydCByZXF1ZXN0ZWQgd2l0aCBcXFwiQWRkaXRpb25hbCBIaXN0b3J5XFxcIiAodGhhdCBpcywgd2l0aCBtb3JlIHRoYW4gNjEgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSB3aWxsIGluY3VyIGFuIEFkZGl0aW9uYWwgSGlzdG9yeSBmZWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLiBUaGUgb3B0aW9uYWwgYHVzZXJgIG9iamVjdCBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR5IHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIHRydWUgdG8gcmV0dXJuIGJhbGFuY2UgYW5kIGlkZW50aXR5IGVhcmxpZXIgYXMgYSBmYXN0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9mYXN0X3JlcG9ydD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2V0IHJlcG9ydC4gUG9zc2libGUgdmFsdWVzOiBgXFxcImludmVzdG1lbnRzXFxcImBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3QgYSBgZmFzdF9hc3NldGAgcmVwb3J0LiBXaGVuIEZhc3QgQXNzZXRzIGlzIHJlcXVlc3RlZCwgUGxhaWQgd2lsbCBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IGZpcnN0LCB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIGFuZCBsYXRlciwgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBoaXN0b3JpY2FsIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIHRyYW5zYWN0aW9uIGRhdGEuIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWRkX29ucz86IEFycmF5PEFzc2V0UmVwb3J0QWRkT25zPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdXNlcj86IEFzc2V0UmVwb3J0VXNlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGZvciB3aGljaCB0byBjcmVhdGUgYW4gYXNzZXQgcmVwb3J0IGZvci4gVGhlIGxhdGVzdCBhc3NldCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGZldGNoIFxcXCJmYXN0XFxcIiB2ZXJzaW9uIG9mIGFzc2V0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gQ2FuIG9ubHkgYmUgdXNlZCBpZiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdhcyBjYWxsZWQgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGZhc3RfcmVwb3J0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgb3IgYWRkIGRhdGEgdG8gYC9hc3NldF9yZXBvcnQvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c190b19pbmNsdWRlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQXNzZXRSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0dXJuZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5nXFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIGhvbGRpbmdzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdG90YWwgdmFsdWUgb2YgdGhlIGhvbGRpbmcuIFRoaXMgZmllbGQgaXMgY2FsY3VsYXRlZCBieSBQbGFpZCBhcyB0aGUgc3VtIG9mIHRoZSBwdXJjaGFzZSBwcmljZSBvZiBhbGwgb2YgdGhlIHNoYXJlcyBpbiB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBzZWN1cml0eSBpcyBhbiBvcHRpb24sIGBxdWFudGl0eWAgd2lsbCByZWZsZWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9ucyAodHlwaWNhbGx5IHRoZSBudW1iZXIgb2YgY29udHJhY3RzIG11bHRpcGxpZWQgYnkgMTAwKSwgbm90IHRoZSBudW1iZXIgb2YgY29udHJhY3RzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW52ZXN0bWVudCBzZWN1cml0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiBWYWxpZCBzZWN1cml0eSB0eXBlcyBhcmU6ICBgY2FzaGA6IENhc2gsIGN1cnJlbmN5LCBhbmQgbW9uZXkgbWFya2V0IGZ1bmRzICBgY3J5cHRvY3VycmVuY3lgOiBEaWdpdGFsIG9yIHZpcnR1YWwgY3VycmVuY2llcyAgYGRlcml2YXRpdmVgOiBPcHRpb25zLCB3YXJyYW50cywgYW5kIG90aGVyIGRlcml2YXRpdmUgaW5zdHJ1bWVudHMgIGBlcXVpdHlgOiBEb21lc3RpYyBhbmQgZm9yZWlnbiBlcXVpdGllcyAgYGV0ZmA6IE11bHRpLWFzc2V0IGV4Y2hhbmdlLXRyYWRlZCBpbnZlc3RtZW50IGZ1bmRzICBgZml4ZWQgaW5jb21lYDogQm9uZHMgYW5kIGNlcnRpZmljYXRlcyBvZiBkZXBvc2l0IChDRHMpICBgbG9hbmA6IExvYW5zIGFuZCBsb2FuIHJlY2VpdmFibGVzICBgbXV0dWFsIGZ1bmRgOiBPcGVuLSBhbmQgY2xvc2VkLWVuZCB2ZWhpY2xlcyBwb29saW5nIGZ1bmRzIG9mIG11bHRpcGxlIGludmVzdG9ycyAgYG90aGVyYDogVW5rbm93biBvciBvdGhlciBpbnZlc3RtZW50IHR5cGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHdpdGhpbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBwb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGFuIEFzc2V0IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QXNzZXRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRBc3NldHM+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfdG9faW5jbHVkZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgY2Fubm90IGJlIGBudWxsYC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBc3NldCBSZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgYXNzZXQgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIFRoZSB1c2VyIG9iamVjdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB0byBiZSBhcHBlbmRlZCB0byB0aGUgQXNzZXQgUmVwb3J0LiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC4gVGhlIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGFuZCBgc3NuYCBmaWVsZHMgYXJlIHJlcXVpcmVkIGlmIHlvdSB3b3VsZCBsaWtlIHRoZSBSZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWXigJlzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgeW91IGRldGVybWluZSBhbmQgc3VibWl0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cmFuY2VzIDEgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25VbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gQW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBQb3N0IERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25Qb3N0RGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlOiBBc3NldFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB3aXRoIHdobyBkaWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZEJ5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBQcm92aWRlZCAtIGV4YW1wbGVzIGFyZSBhdG0sIGNhc2gsIGNoZWNrLCBjcmVkaXQsIGRlYml0LCBkZXBvc2l0LCBkaXJlY3REZWJpdCwgZGlyZWN0RGVwb3NpdCwgZGl2aWRlbmQsIGZlZSwgaW50ZXJlc3QsIG90aGVyLCBwYXltZW50LCBwb2ludE9mU2FsZSwgcmVwZWF0UGF5bWVudCwgc2VydmljZUNoYXJnZSwgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzRXJyb3JXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXBvcnQgdHlwZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBBc3NldCBSZXBvcnQgaXMgYSBgZnVsbGAgb3IgYGZhc3RgIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0TnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEF1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgdmVyaWZpZWQgdmlhIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cy4gV2UgcmVjb21tZW5kIGNvbW11bmljYXRpbmcgdG8geW91ciB1c2VycyB3aGVuIHRoaXMgZXZlbnQgaXMgcmVjZWl2ZWQgdG8gbm90aWZ5IHRoZW0gdGhhdCB0aGVpciBhY2NvdW50IGlzIHZlcmlmaWVkIGFuZCByZWFkeSBmb3IgdXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgaW4gQ1JBIGVuYWJsZWQgY2xpZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVmcmVzaCByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlZnJlc2hlZCBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC4gVG8gZ2V0IHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIHZpYSB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgaXMgZGV0ZWN0ZWQuIFlvdSBzaG91bGQgY2FsbCBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCB0byBnZXQgdXBkYXRlZCBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuIFRvIHJlY2VpdmUgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgaW4gdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU/OiBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgYmFuayB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSB0eXBlIG9mIHRoaXMgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldmVyc2VkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYmFuayB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyczogQXJyYXk8QmFua1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCwgYHNhbWUtZGF5LWFjaGAsIG9yIGB3aXJlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXAgZGVzY3JpYmVzIGEgc3dlZXAgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGZ1bGwgbGVnYWwgbmFtZS4gSWYgdGhlIHRyYW5zZmVyIGBhY2hfY2xhc3NgIGlzIGBjY2RgLCB0aGlzIHNob3VsZCBiZSB0aGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpbiByZXNwb25zZSBkYXRhLiBEbyBub3QgcHJvdmlkZSB0aGlzIGZpZWxkIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgYmFuayB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IEFDSCBldmVudHMgYXJlIGF2YWlsYWJsZS4gVG8gYmVnaW4gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IG11c3QgZmlyc3QgcmVnaXN0ZXIgeW91ciB3ZWJob29rIGxpc3RlbmVyIGVuZHBvaW50IHZpYSB0aGUgW3dlYmhvb2tzIHBhZ2UgaW4gdGhlIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vd2ViaG9va3MpLiBUaGUgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgY2FuIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHByb2dyZXNzIG9mIEFDSCB0cmFuc2ZlcnMgdXNlZCBpbiBbbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb25dKC9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBOb3RlIHRoYXQgW1RyYW5zZmVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSBjdXN0b21lcnMgc2hvdWxkIHVzZSBUcmFuc2ZlciB3ZWJob29rcyBpbnN0ZWFkIG9mIHVzaW5nIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYDsgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50cyBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQmFzZSBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBCYXNlIFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlcztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLiBUcmFuc2FjdGlvbiBoaXN0b3J5IHJldHVybmVkIGJ5IGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSB0b3AtbGV2ZWwgYHRyYW5zYWN0aW9uc2AgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlOiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzIGFuZCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBgYnJva2VyYWdlYCBvciBgaW52ZXN0bWVudGAgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pbnNpZ2h0cz86IEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGFuZCBleHBlY3RlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBhbmQgdGhlIEl0ZW0gY29udGFpbnMgb25lIG9yIG1vcmUgYWNjb3VudHMgd2l0aCBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgdHlwZSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIENhcGl0YWwgT25lIGRlcG9zaXRvcnkgYWNjb3VudHMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgYWNjb3VudCB0eXBlcyBvbiBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFNlZSBbYWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvciBhIGZ1bGwgbGlzdCBvZiBhY2NvdW50IHR5cGVzLiAgSWYgdGhlIGJhbGFuY2UgdGhhdCBpcyBwdWxsZWQgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wIGZvciBJdGVtcyB3aXRoIHRoaXMgZmllbGQgcmVxdWlyZWQsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZm9yIHRoZSBlbnRpcmUgcmVwb3J0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIG9mIGVhY2ggY2FsZW5kYXIgbW9udGhcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9tb250aGx5X2JhbGFuY2VzPzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBmcm9tIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RoaXJ0eV9kYXlfYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZm9yIHRoZSBlbnRpcmUgcmVwb3J0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc0FsbE9mXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2Ugb2YgZWFjaCBjYWxlbmRhciBtb250aFxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RoaXJ0eV9kYXlfYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlZCBpbnNpZ2h0cyBkZXJpdmVkIGZyb20gdHJhbnNhY3Rpb24tbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgZGF5cyBhdmFpbGFibGUgaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb25nZXN0IGdhcCBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbG9uZ2VzdF9nYXBfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlYml0cyBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2luZmxvd3M/OiBBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9pbmZsb3dfYW1vdW50PzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNyZWRpdCBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX291dGZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX291dGZsb3dfYW1vdW50PzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyB3aXRoIG5vIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfZGF5c19ub190cmFuc2FjdGlvbnM/OiBudW1iZXI7XG59XG4vKipcbiAqIEF2ZXJhZ2UgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgb3IgZGViaXQgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYWRkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQmFzZVJlcG9ydEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBCYXNlUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgaWRlbnRpdHkgaW5mb3JtYXRpb24gY2Fubm90IGJlIHJldHVybmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBCYXNlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+O1xufVxuLyoqXG4gKiBMYXJnZXN0IG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgcGVyIGNhbGVuZGFyIG1vbnRoXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGlzIHRpbWUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYWRkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudCBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFdhcm5pbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgT1dORVJTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggQ3JlZGl0IGFuZCBEZXBvc2l0b3J5IGFjY291bnRzIGFyZSB1bmF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRXYXJuaW5nQ29kZSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBCYXNlIFJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIFRoZSByZXN1bHRpbmcgYGVycm9yYCB3aWxsIGhhdmUgYW4gYGVycm9yX3R5cGVgIG9mIGBCQVNFX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCQVNFX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEJhc2UgUmVwb3J0IGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgYC9jcmEvYmFzZV9yZXBvcnQvZ2V0YCBpcyByZWFkeSB0byBiZSBjYWxsZWQuICBJZiB5b3UgYXR0ZW1wdCB0byByZXRyaWV2ZSBhIEJhc2UgUmVwb3J0IGJlZm9yZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB5b3XigJlsbCByZWNlaXZlIGEgcmVzcG9uc2Ugd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA0MDAgYW5kIGEgUGxhaWQgZXJyb3IgY29kZSBvZiBgUFJPRFVDVF9OT1RfUkVBRFlgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCQVNFX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgc291cmNlOiBCZWFjb25BdWRpdFRyYWlsU291cmNlO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHR5cGUgaW5kaWNhdGluZyB3aGF0IGNhdXNlZCBhIHJlc291cmNlIHRvIGJlIGNoYW5nZWQgb3IgdXBkYXRlZC4gICBgZGFzaGJvYXJkYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGJ5IGEgbWVtYmVyIG9mIHlvdXIgdGVhbSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC4gIGBhcGlgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgdmlhIHRoZSBQbGFpZCBBUEkuICBgc3lzdGVtYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBwYXJ0IG9mIHRoZSBQbGFpZCBCZWFjb24gc3lzdGVtLiBGb3IgZXhhbXBsZSwgaWYgYW5vdGhlciBidXNpbmVzcyB1c2luZyBQbGFpZCBCZWFjb24gY3JlYXRlZCBhIGZyYXVkIHJlcG9ydCB0aGF0IG1hdGNoZWQgb25lIG9mIHlvdXIgdXNlcnMsIHlvdXIgbWF0Y2hpbmcgdXNlclxcJ3Mgc3RhdHVzIHdvdWxkIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCBhbmQgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgc3lzdGVtYC4gIGBidWxrX2ltcG9ydGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhcyBwYXJ0IG9mIGEgYnVsayBpbXBvcnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgY29tcGFueSBwcm92aWRlZCBhIENTViBvZiB1c2VyIGRhdGEgYXMgcGFydCBvZiB5b3VyIGluaXRpYWwgb25ib2FyZGluZywgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgYnVsa19pbXBvcnRgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uQXVkaXRUcmFpbFNvdXJjZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgQXBpID0gJ2FwaScsXG4gICAgU3lzdGVtID0gJ3N5c3RlbScsXG4gICAgQnVsa0ltcG9ydCA9ICdidWxrX2ltcG9ydCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgY3JlYXRlZCB3aXRoaW4geW91ciBvcmdhbml6YXRpb24gbWF0Y2hlcyBvbmUgb2YgeW91ciBleGlzdGluZyB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBEVVBMSUNBVEVfREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX2R1cGxpY2F0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gRHVwbGljYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudD86IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgZnJhdWQgY29tbWl0dGVkIGJ5IGEgdXNlciBhcyB3ZWxsIGFzIHRoZSBkYXRlIHRoZSBmcmF1ZCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgdG90YWwgYW1vdW50IG9mIG1vbmV5IGxvc3QgZHVlIHRvIHRoZSBmcmF1ZCBpbmNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBibG9jayBzaW1pbGFyIGZyYXVkIGF0dGVtcHRzIG9uIHlvdXIgcGxhdGZvcm0gYXMgd2VsbCBhcyBhbGVydCBvdGhlciBjb21wYW5pZXMgd2hvIHNjcmVlbiBhIHVzZXIgd2l0aCBtYXRjaGluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4gT3RoZXIgY29tcGFuaWVzIHdpbGwgbm90IHJlY2VpdmUgYW55IG5ldyBpZGVudGl0eSBpbmZvcm1hdGlvbiwganVzdCB3aGF0IG1hdGNoZWQsIHBsdXMgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmR1c3RyeSwgdHlwZSBvZiBmcmF1ZCwgYW5kIGRhdGUgb2YgZnJhdWQuICBZb3UgY2FuIG1hbmFnZSB5b3VyIGZyYXVkIHJlcG9ydHMgYnkgYWRkaW5nLCBkZWxldGluZywgb3IgZWRpdGluZyByZXBvcnRzIGFzIHlvdSBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmcmF1ZHVsZW50IHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzIGlzIGZpcnN0IHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBCZWFjb24gUmVwb3J0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydHM6IEFycmF5PEJlYWNvblJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIHJlcG9ydDogQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcztcbn1cbi8qKlxuICogQW5hbHlzaXMgb2Ygd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCB3YXMgc3luZGljYXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZXBvcnQgY3JlYXRlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgbWF0Y2hlcyB3aXRoIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfU1lORElDQVRJT05fQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbnM6IEFycmF5PEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gYSBCZWFjb24gUmVwb3J0IHRoYXQgaGFzIGJlZW4gc3luZGljYXRlZCB0byBhIG1hdGNoaW5nIEJlYWNvbiBVc2VyIGluIHlvdXIgcHJvZ3JhbS4gIFRoZSBgaWRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpcyB0aGUgSUQgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydCB0aGF0IHdhcyBzeW5kaWNhdGVkLiBJZiB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uLCB0aGUgZmllbGQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgSUQgb2YgdGhlIHJlcG9ydC4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgd2lsbCBiZSBgbnVsbGAgaW5kaWNhdGluZyB0aGF0IHRoZSBvcmlnaW5hbCByZXBvcnQgd2FzIGNyZWF0ZWQgYnkgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIEJlYWNvbiBSZXBvcnQuICBgZmlyc3RfcGFydHlgOiBJZiB0aGlzIGlzIHRoZSBzYW1lIGluZGl2aWR1YWwgYXMgdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3RvbGVuYDogSWYgdGhpcyBpcyBhIGRpZmZlcmVudCBpbmRpdmlkdWFsIGZyb20gdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3ludGhldGljYDogSWYgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIHVzaW5nIGZhYnJpY2F0ZWQgaW5mb3JtYXRpb24uICBgYWNjb3VudF90YWtlb3ZlcmA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgYWNjb3VudCB3YXMgY29tcHJvbWlzZWQuICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEV2ZW4gaWYgYW4gYWRkcmVzcyBoYXMgYmVlbiBjb2xsZWN0ZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBhIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBVc2VyLiAgVGhlIHByaW1hcnkgdXNlIGZvciB0aGlzIGVuZHBvaW50IGlzIHRvIGFkZCBhIG5ldyBlbmQgdXNlciB0byBCZWFjb24gZm9yIGZyYXVkIGFuZCBkdXBsaWNhdGUgc2Nhbm5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGFsc28gYmUgdXNlZCB0byBpbXBvcnQgaGlzdG9yaWNhbCBmcmF1ZCBjYXNlcyBpbnRvIHRoZSBCZWFjb24gTmV0d29yayB3aXRob3V0IGJlaW5nIGNoYXJnZWQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuIFRvIGltcG9ydCBoaXN0b3JpY2FsIGZyYXVkIGNhc2VzLCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSBvcHRpb25hbCBgcmVwb3J0YCBzZWN0aW9uIG9mIHRoZSByZXF1ZXN0IHBheWxvYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJJRE51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGlkZW50aXR5IGRvY3VtZW50IHZhbHVlIHR5cGVkIGluIGJ5IHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgUmV2aXNpb24gaWRlbnRpZmllcyBhIEJlYWNvbiBVc2VyIGF0IHNvbWUgcG9pbnQgaW4gaXRzIHJldmlzaW9uIGhpc3RvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpc2lvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgcmV2aXNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgYHJlamVjdGVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIHJlamVjdGVkIGZvciBmcmF1ZC4gVXNlcnMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkgcmVqZWN0ZWQuICBgcGVuZGluZ19yZXZpZXdgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gbWFya2VkIGZvciByZXZpZXcuICBgY2xlYXJlZGA6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBjbGVhcmVkIG9mIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uVXNlclN0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgc3RhdHVzIGhhcyBjaGFuZ2VkLCB3aGljaCBjYW4gb2NjdXIgbWFudWFsbHkgdmlhIHRoZSBkYXNoYm9hcmQgb3Igd2hlbiBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YTtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQVjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDYXRlZ29yaWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NhdGVnb3JpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdHJhbnNhY3Rpb24gY2F0ZWdvcmllcyB1c2VkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3JpZXM6IEFycmF5PENhdGVnb3J5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgdHJhbnNhY3Rpb24gY2F0ZWdvcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgY2F0ZWdvcnkuIGBjYXRlZ29yeV9pZGAgaXMgYSBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lcmNoYW50IGNhdGVnb3J5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgcGxhY2VgIGZvciBwaHlzaWNhbCB0cmFuc2FjdGlvbnMgb3IgYHNwZWNpYWxgIGZvciBvdGhlciB0cmFuc2FjdGlvbnMgc3VjaCBhcyBiYW5rIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBncm91cDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgYGNhdGVnb3J5X2lkYCBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGhpZXJhcmNoeTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ2F0ZWdvcnkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5IHNvcnRlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG9wX2NvdW50ZXJwYXJ0aWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb24gYSB1c2VyXFwncyB0b3AgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgcmFua2VkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHRzXG4gICAgICovXG4gICAgcHJpbWFyeV9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5zaWdodHMgb2YgdG9wIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QsIHRvIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyBwdXJwb3Nlcy4gVGhpcyBmaWVsZCB3aWxsIGJlIG9taXR0ZWQgaW4gZXJyb3JzIHByb3ZpZGVkIGJ5IHdlYmhvb2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgQXNzZXRzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIFBsYWlkIGRvY3VtZW50YXRpb24gcGFnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdXNlQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZUFsbE9mXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gdGhhdCBQbGFpZCBoYXMgZW5oYW5jZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgdG8gdGllIHRyYW5zYWN0aW9ucyBiYWNrIHRvIGNsaWVudHNcXCcgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIGFjY291bnRcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbmhhbmNlbWVudHN9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGVuaGFuY2VtZW50czogRW5oYW5jZW1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbnJpY2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gYXMgcHJvdmlkZWQgYnkgeW91IGluIHRoZSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB1c2VyLCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X2FjY291bnRfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gKD49IDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24gZS5nLiBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNobWVudHN9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGVucmljaG1lbnRzOiBFbnJpY2htZW50cztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gZm9yIFBsYWlkIHRvIGVuaGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIHVzZWQgdG8gaGVscCB5b3UgdGllIGRhdGEgYmFjayB0byB5b3VyIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRpcmVjdGlvbi4gKE5PVEU6IHRoaXMgd2lsbCBhZmZlY3QgZW5yaWNobWVudCByZXN1bHRzLCBzbyBkaXJlY3Rpb25zIGFyZSBpbXBvcnRhbnQpOi4gICBOZWdhdGl2ZSAoLSkgZm9yIGNyZWRpdHMgKGUuZy4sIGluY29taW5nIHRyYW5zZmVycywgcmVmdW5kcykgICBQb3NpdGl2ZSAoKykgZm9yIGRlYml0cyAoZS5nLiwgcHVyY2hhc2VzLCBmZWVzLCBvdXRnb2luZyB0cmFuc2ZlcnMpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gZm9yIFBsYWlkIHRvIGVucmljaC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X2FjY291bnRfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi4gSWYgeW91IGhhdmUgbG9jYXRpb24gZGF0YSBpbiBhdmFpbGFibGUgYW4gdW5zdHJ1Y3R1cmVkIGZvcm1hdCwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gKD49IDApLiBXaGVuIHRlc3RpbmcgRW5yaWNoLCBub3RlIHRoYXQgYGFtb3VudGAgZGF0YSBzaG91bGQgYmUgcmVhbGlzdGljLiBVbnJlYWxpc3RpYyBvciBpbmFjY3VyYXRlIGBhbW91bnRgIGRhdGEgbWF5IHJlc3VsdCBpbiByZWR1Y2VkIHF1YWxpdHkgb3V0cHV0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMgKE1DQ3MpIGFyZSBmb3VyLWRpZ2l0IG51bWJlcnMgdGhhdCBkZXNjcmliZSBhIG1lcmNoYW50XFwncyBwcmltYXJ5IGJ1c2luZXNzIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1jYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZD86IHN0cmluZztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UuICBVc2UgdGhpcyBmaWVsZCB0byBwYXNzIGluIHN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24geW91IG1heSBoYXZlIGFib3V0IHlvdXIgdHJhbnNhY3Rpb25zLiBQcm92aWRpbmcgbG9jYXRpb24gZGF0YSBpcyBvcHRpb25hbCBidXQgY2FuIGluY3JlYXNlIHJlc3VsdCBxdWFsaXR5LiBJZiB5b3UgaGF2ZSB1bnN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24sIGl0IG1heSBiZSBhcHBlbmRlZCB0byB0aGUgYGRlc2NyaXB0aW9uYCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHJlYXNvbiBhIGNvbnN1bWVyIHJlcG9ydCBpcyBjcmVhdGVkIGZvciAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYEFDQ09VTlRfUkVWSUVXX05PTl9DUkVESVRgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgb2YgdGhlIGluZm9ybWF0aW9uIHRvIHJldmlldyBhIG5vbi1jcmVkaXQgYWNjb3VudCBwcm92aWRlZCBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc3VtZXIgY29udGludWVzIHRvIG1lZXQgdGhlIHRlcm1zIG9mIHRoZSBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoMikuIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiBgRVhURU5TSU9OX09GX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNyZWRpdCB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgYW5kIGludm9sdmluZyB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIGluIGNvbm5lY3Rpb24gd2l0aCBhIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMgaW4gY29ubmVjdGlvbiB3aXRoIGEgcHJvcGVydHkgcmVudGFsIGFzc2Vzc21lbnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYFdSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHRvIGV2YWx1YXRlIGFuIGFwcGxpY2F0aW9u4oCZcyBwcm9maWxlIHRvIG1ha2UgYW4gb2ZmZXIgdG8gdGhlIGNvbnN1bWVyLiBgV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHN1Y2ggYXMgd2hlbiBhbiBpbmRpdmlkdWFsIGFncmVlcyB0byBhY3QgYXMgYSBndWFyYW50b3Igb3IgYXNzdW1lcyBwZXJzb25hbCBsaWFiaWxpdHkgZm9yIGEgY29uc3VtZXIsIGJ1c2luZXNzLCBvciBjb21tZXJjaWFsIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSB7XG4gICAgQWNjb3VudFJldmlld0NyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19DUkVESVQnLFxuICAgIEFjY291bnRSZXZpZXdOb25DcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVCcsXG4gICAgRW1wbG95bWVudCA9ICdFTVBMT1lNRU5UJyxcbiAgICBFeHRlbnNpb25PZkNyZWRpdCA9ICdFWFRFTlNJT05fT0ZfQ1JFRElUJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkVGVuYW50U2NyZWVuaW5nID0gJ0xFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkT3RoZXIgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX09USEVSJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25QcmVxdWFsaWZpY2F0aW9uID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTicsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUidcbn1cblxuLyoqXG4gKiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSBkZWZpbmVzIHRoZSB1c2VyIGlkZW50aXR5IGRhdGEgY29sbGVjdGVkIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBiZSBzZXQgaWYgeW91IGxhdGVyIHVzZSB0aGUgY3JlYXRlZCB1c2VyIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVycy4gVGhlIGZvcm1hdCBvZiBwaG9uZSBudW1iZXIgd2lsbCBiZSB2YWxpZGF0ZWQgYW5kIGZvciBiZXR0ZXIgbm9ybWFsaXphdGlvbiwgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gRS4xNjQgZm9ybWF0ICt7Y291bnRyeWNvZGV9e251bWJlcn0sIGZvciBleGFtcGxlIGArMTQxNTEyMzQ1NjdgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJwYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnlfY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zaWdodHMgYXJvdW5kIGEgdXNlclxcJ3MgY291bnRlcnBhcnRpZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgcmVsYXRlZCB0byBhIHVzZXLigJlzIHRyYW5zYWN0aW9ucyB3aXRoIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBkZXRlY3RlZCBhY2NvdW50IHR5cGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAgICAgKi9cbiAgICBmaW5hbmNpYWxfaW5zdGl0dXRpb25faW5zaWdodHM/OiBBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBJbnNpZ2h0cyBhYm91dCBhIHVzZXLigJlzIHRvcCBtZXJjaGFudHMsIHJhbmtlZCBieSBzcGVuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfaW5zaWdodHM/OiBBcnJheTxNZXJjaGFudEluc2lnaHRzPjtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSB0eXBlLiAgYG1lcmNoYW50YDogYSBwcm92aWRlciBvZiBnb29kcyBvciBzZXJ2aWNlcyBmb3IgcHVyY2hhc2UgYGZpbmFuY2lhbF9pbnN0aXR1dGlvbmA6IGEgZmluYW5jaWFsIGVudGl0eSAoYmFuaywgY3JlZGl0IHVuaW9uLCBCTlBMLCBmaW50ZWNoKSBgcGF5bWVudF9hcHBgOiBhIHRyYW5zZmVyIG9yIFAyUCBhcHAgKGUuZy4gWmVsbGUpIGBtYXJrZXRwbGFjZWA6IGEgbWFya2V0cGxhY2UgKGUuZyBEb29yRGFzaCwgR29vZ2xlIFBsYXkgU3RvcmUpIGBwYXltZW50X3Rlcm1pbmFsYDogYSBwb2ludC1vZi1zYWxlIHBheW1lbnQgdGVybWluYWwgKGUuZyBTcXVhcmUsIFRvYXN0KSBgaW5jb21lX3NvdXJjZWA6IHRoZSBwYXllciBpbiBhbiBpbmNvbWUgdHJhbnNhY3Rpb24gKGUuZy4sIGFuIGVtcGxveWVyLCBjbGllbnQsIG9yIGdvdmVybm1lbnQgYWdlbmN5KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRlcnBhcnR5VHlwZSB7XG4gICAgTWVyY2hhbnQgPSAnbWVyY2hhbnQnLFxuICAgIEZpbmFuY2lhbEluc3RpdHV0aW9uID0gJ2ZpbmFuY2lhbF9pbnN0aXR1dGlvbicsXG4gICAgUGF5bWVudEFwcCA9ICdwYXltZW50X2FwcCcsXG4gICAgTWFya2V0cGxhY2UgPSAnbWFya2V0cGxhY2UnLFxuICAgIFBheW1lbnRUZXJtaW5hbCA9ICdwYXltZW50X3Rlcm1pbmFsJyxcbiAgICBJbmNvbWVTb3VyY2UgPSAnaW5jb21lX3NvdXJjZSdcbn1cblxuLyoqXG4gKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRyeUNvZGUge1xuICAgIFVzID0gJ1VTJyxcbiAgICBHYiA9ICdHQicsXG4gICAgRXMgPSAnRVMnLFxuICAgIE5sID0gJ05MJyxcbiAgICBGciA9ICdGUicsXG4gICAgSWUgPSAnSUUnLFxuICAgIENhID0gJ0NBJyxcbiAgICBEZSA9ICdERScsXG4gICAgSXQgPSAnSVQnLFxuICAgIFBsID0gJ1BMJyxcbiAgICBEayA9ICdESycsXG4gICAgTm8gPSAnTk8nLFxuICAgIFNlID0gJ1NFJyxcbiAgICBFZSA9ICdFRScsXG4gICAgTHQgPSAnTFQnLFxuICAgIEx2ID0gJ0xWJyxcbiAgICBQdCA9ICdQVCcsXG4gICAgQmUgPSAnQkUnXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgQmFuayBJbmNvbWUgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgSW5jb21lIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDcmFCYW5rSW5jb21lV2FybmluZz47XG59XG4vKipcbiAqIFRoZSBJdGVtXFwncyBiYW5rIGFjY291bnRzIHRoYXQgaGF2ZSB0aGUgc2VsZWN0ZWQgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IGFuZCBhc3NvY2lhdGVkIGBpdGVtX2lkYCB1c2VkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgSXRlbSBhbmQgZXJyb3Igd2hlbiBhIGJhdGNoIG9wZXJhdGlvbiBvcGVyYXRpbmcgb24gbXVsdGlwbGUgSXRlbXMgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIGluIG9uZSBvZiB0aGUgSXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDYXVzZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyYS9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBBcnJheTxDcmFCYW5rSW5jb21lPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW5kIHVzZXJcXCdzIG1vbnRobHkgc3VtbWFyeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKSBvZiB0aGUgdXNlciBmb3IgdGhlIG1vbnRoIGluIHRoZSBzdW1tYXJ5LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHBlcmlvZCBjb3ZlcmVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcGVyaW9kIGluY2x1ZGVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGxhc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBlbmQgd2l0aCB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW1cXCdzIGFjY291bnRzIHRoYXQgaGF2ZSBCYW5rIEluY29tZSBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfYWNjb3VudHM/OiBBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGluY29tZSBzb3VyY2VzIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgc2luZ2xlIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3NvdXJjZXM/OiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgYmFuayBpbmNvbWUgYWNyb3NzIGFsbCBpbmNvbWUgc291cmNlcyBhbmQgaXRlbXMgKG1heCBoaXN0b3J5IG9mIDczMCBkYXlzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGVzdGltYXRlIG9mIHRoZSBhdmVyYWdlIGdyb3NzIG1vbnRobHkgaW5jb21lIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIG5ldCBhbW91bnQgYW5kIGluY29tZSBjYXRlZ29yeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIGRhdGEgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U/OiBDcmFCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgaWRlbnRpdHkgZm9yIHRoZSBJdGVtIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgUmVwb3J0RGVsZXRlZCA9ICdSRVBPUlRfREVMRVRFRCcsXG4gICAgRGF0YVVuYXZhaWxhYmxlID0gJ0RBVEFfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgMTA5OSB0YXggZm9ybVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE/OiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGb3JtMTA5OVR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmb3JtXzEwOTlfdHlwZT86IEZvcm0xMDk5VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OVJlY2lwaWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlY2lwaWVudD86IENyZWRpdDEwOTlSZWNpcGllbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlQYXllcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyPzogQ3JlZGl0MTA5OVBheWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5RmlsZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaWxlcj86IENyZWRpdDEwOTlGaWxlcjtcbiAgICAvKipcbiAgICAgKiBUYXggeWVhciBvZiB0aGUgdGF4IGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRheF95ZWFyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcmVudCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcmVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiByb3lhbHRpZXMgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJveWFsdGllcz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIG90aGVyIGluY29tZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb3RoZXJfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZpc2hpbmcgYm9hdCBwcm9jZWVkcyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaXNoaW5nX2JvYXRfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtZWRpY2FsIGFuZCBoZWFsdGhjYXJlIHBheW1lbnRzIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lZGljYWxfYW5kX2hlYWx0aGNhcmVfcGF5bWVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBub25lbXBsb3llZSBjb21wZW5zYXRpb24gZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm9uZW1wbG95ZWVfY29tcGVuc2F0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3Vic3RpdHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdWJzdGl0dXRlX3BheW1lbnRzX2luX2xpZXVfb2ZfZGl2aWRlbmRzX29yX2ludGVyZXN0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBwYXllciBtYWRlIGRpcmVjdCBzYWxlcyBvdmVyICQ1MDAwIG9mIGNvbnN1bWVyIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9tYWRlX2RpcmVjdF9zYWxlc19vZl81MDAwX29yX21vcmVfb2ZfY29uc3VtZXJfcHJvZHVjdHNfdG9fYnV5ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBjcm9wIGluc3VyYW5jZSBwcm9jZWVkcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY3JvcF9pbnN1cmFuY2VfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBnb2xkZW4gcGFyYWNodXRlIHBheW1lbnRzIG1hZGUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGV4Y2Vzc19nb2xkZW5fcGFyYWNodXRlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ3Jvc3MgcHJvY2VlZHMgcGFpZCB0byBhbiBhdHRvcm5leSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZ3Jvc3NfcHJvY2VlZHNfcGFpZF90b19hbl9hdHRvcm5leT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgZGVmZXJyYWxzIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2RlZmVycmFscz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgaW5jb21lIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfdGF4X3dpdGhoZWxkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3RhdGUgdGF4IHdpdGhoZWxkIG9mIHBheWVyIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZF9sb3dlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfc3RhdGVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcl9sb3dlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHJlcG9ydGVkIGZvciBwcmltYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQgUGF5bWVudCBjYXJkIFRoaXJkIHBhcnR5IG5ldHdvcmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3JlcG9ydGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIChYWFgpIFhYWC1YWFhYLiBQaG9uZSBudW1iZXIgb2YgdGhlIFBTRSAoUGF5bWVudCBTZXR0bGVtZW50IEVudGl0eSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBzZV90ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBHcm9zcyBhbW91bnQgcmVwb3J0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIGNhcmQgbm90IHByZXNlbnQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBjYXJkX25vdF9wcmVzZW50X3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWVyY2hhbnRfY2F0ZWdvcnlfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHBheW1lbnQgdHJhbnNhY3Rpb25zIG1hZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG51bWJlcl9vZl9wYXltZW50X3RyYW5zYWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBKYW51YXJ5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBqYW51YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBGZWJydWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmVicnVhcnlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIE1hcmNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXJjaF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXByaWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGFwcmlsX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1heV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVuZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVuZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVseV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXVndXN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhdWd1c3RfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIFNlcHRlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VwdGVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBPY3RvYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBvY3RvYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBOb3ZlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm92ZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIERlY2VtYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkZWNlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlY29uZGFyeSBzdGF0ZSBvZiBidXNpbmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgdGF4IHJlcG9ydGVkIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGVyIHVzZWQgYnkgMTA5OS1LIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlGaWxlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OUZpbGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIGZpbGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlGaWxlclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQ6IFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkgKFBTRSksIEVsZWN0cm9uaWMgUGF5bWVudCBGYWNpbGl0YXRvciAoRVBGKSwgT3RoZXIgVGhpcmQgUGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHBheWVyIHVzZWQgYnkgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlQYXllclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OVBheWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlQYXllclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVsZXBob25lIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlY2lwaWVudCB1c2VkIGluIGJvdGggMTA5OS1LIGFuZCAxMDk5LU1JU0MgdGF4IGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OVJlY2lwaWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgbnVtYmVyIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgRkFDVEEgaXMgYSBmaWxpbmcgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZhY3RhX2ZpbGluZ19yZXF1aXJlbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2hlY2tlZCBpZiAybmQgVElOIGV4aXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgc2Vjb25kX3Rpbl9leGlzdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSB0cmFuc2Zlci4gUmVxdWlyZWQgZm9yIHRyYW5zZmVycyBvbiBhbiBBQ0ggbmV0d29yay4gIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGVnLiBiaWxsIHBheW1lbnQgIGBcXFwid2ViXFxcImAgLSBBIGNyZWRpdCBFbnRyeSBpbml0aWF0ZWQgYnkgb3Igb24gYmVoYWxmIG9mIGEgaG9sZGVyIG9mIGEgQ29uc3VtZXIgQWNjb3VudCB0aGF0IGlzIGludGVuZGVkIGZvciBhIENvbnN1bWVyIEFjY291bnQgb2YgYSBSZWNlaXZlclxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgY3JlZGl0IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtY3JlZGl0KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFjY291bnRTdWJ0eXBlIHtcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgYW4gYW1vdW50LCBkZW5vbWluYXRlZCBpbiB0aGUgY3VycmVuY3kgc3BlY2lmaWVkIGJ5IGVpdGhlciBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbnM7IGNhbiBpbmNsdWRlIGF0IG1vc3Qgb25lIFZPQS9zdGFuZGFyZCBBc3NldCBSZXBvcnQgdG9rZW5zIGFuZCBvbmUgVk9FIEFzc2V0IFJlcG9ydCBUb2tlbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IsIHdoaWNoIGFsbG93cyB0aGVtIHRvIGZldGNoIHRoZSBBc3NldCBSZXBvcnRzIGF0dGFjaGVkIHRvIHRoZSB0b2tlbi4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHlvdSB3b3VsZCBsaWtlIHRvIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdG9rZW5zIHdoaWNoIHRoZSBzcGVjaWZpZWQgQXVkaXQgQ29weSBUb2tlbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aC4gVGhlIHR5cGVzIG9mIHRva2VuIHN1cHBvcnRlZCBhcmUgYXNzZXQgcmVwb3J0IHRva2VuIGFuZCBlbXBsb3ltZW50IHJlcG9ydCB0b2tlbi4gVGhlcmUgY2FuIGJlIGF0IG1vc3QgMSBvZiBlYWNoIHRva2VuIHR5cGUgaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJhbmsgZW1wbG95bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0QmFua0VtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBkZXBvc2l0IGZyb20gdGhpcyBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGxhdGVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIgZnJvbSB3aXRoaW4gdGhlIHBlcmlvZCBvZiB0aGUgZGF5cyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlYXJsaWVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBCYW5rIEVtcGxveW1lbnQgZGF0YS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhIGRpc3RpbmN0IGJhbmsgZW1wbG95bWVudCByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQgd2FzIGdlbmVyYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgRW1wbG95bWVudCByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz47XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIHR5cGUgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEJBTktfRU1QTE9ZTUVOVF9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGUge1xuICAgIEJhbmtFbXBsb3ltZW50V2FybmluZyA9ICdCQU5LX0VNUExPWU1FTlRfV0FSTklORydcbn1cblxuLyoqXG4gKiBUaGUgcmVwb3J0IG9mIHRoZSBCYW5rIEluY29tZSBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEluY29tZSBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgQmFuayBJbmNvbWUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogRGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIElkZW50aXR5IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBzbyBmaWVsZCBtYXkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IHR5cGUuIFRoaXMgd2lsbCBhbHdheXMgYmUgYGRlcG9zaXRvcnlgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlIHtcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknXG59XG5cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeS4gTm90ZSB0aGF0IHRoZSBgQ0FTSGAgdmFsdWUgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgdXNlZCBvbmx5IGZvciBleGlzdGluZyBsZWdhY3kgaW1wbGVtZW50YXRpb25zLiBJdCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbmV3IGNhdGVnb3JpZXMgYENBU0hfREVQT1NJVGAgKHJlcHJlc2VudGluZyBjYXNoIG9yIGNoZWNrIGRlcG9zaXRzKSBhbmQgYFRSQU5TRkVSX0ZST01fQVBQTElDQVRJT05gIChyZXByZXNlbnRpbmcgY2FzaCB0cmFuc2ZlcnMgb3JpZ2luYXRpbmcgZnJvbSBhcHBzLCBzdWNoIGFzIFplbGxlIG9yIFZlbm1vKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IENyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gRXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIG51bGwgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdhcm5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGUge1xuICAgIEludGVybmFsU2VydmVyRXJyb3IgPSAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcbiAgICBJbnN1ZmZpY2llbnRDcmVkZW50aWFscyA9ICdJTlNVRkZJQ0lFTlRfQ1JFREVOVElBTFMnLFxuICAgIEl0ZW1Mb2NrZWQgPSAnSVRFTV9MT0NLRUQnLFxuICAgIFVzZXJTZXR1cFJlcXVpcmVkID0gJ1VTRVJfU0VUVVBfUkVRVUlSRUQnLFxuICAgIENvdW50cnlOb3RTdXBwb3J0ZWQgPSAnQ09VTlRSWV9OT1RfU1VQUE9SVEVEJyxcbiAgICBJbnN0aXR1dGlvbkRvd24gPSAnSU5TVElUVVRJT05fRE9XTicsXG4gICAgSW5zdGl0dXRpb25Ob0xvbmdlclN1cHBvcnRlZCA9ICdJTlNUSVRVVElPTl9OT19MT05HRVJfU1VQUE9SVEVEJyxcbiAgICBJbnN0aXR1dGlvbk5vdFJlc3BvbmRpbmcgPSAnSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkcnLFxuICAgIEludmFsaWRDcmVkZW50aWFscyA9ICdJTlZBTElEX0NSRURFTlRJQUxTJyxcbiAgICBJbnZhbGlkTWZhID0gJ0lOVkFMSURfTUZBJyxcbiAgICBJbnZhbGlkU2VuZE1ldGhvZCA9ICdJTlZBTElEX1NFTkRfTUVUSE9EJyxcbiAgICBJdGVtTG9naW5SZXF1aXJlZCA9ICdJVEVNX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBNZmFOb3RTdXBwb3J0ZWQgPSAnTUZBX05PVF9TVVBQT1JURUQnLFxuICAgIE5vQWNjb3VudHMgPSAnTk9fQUNDT1VOVFMnLFxuICAgIEl0ZW1Ob3RTdXBwb3J0ZWQgPSAnSVRFTV9OT1RfU1VQUE9SVEVEJyxcbiAgICBBY2Nlc3NOb3RHcmFudGVkID0gJ0FDQ0VTU19OT1RfR1JBTlRFRCdcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBJbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgcGF5IGZyZXF1ZW5jeS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3kge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgRGFpbHkgPSAnREFJTFknLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBkYXlzIG9mIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgcmVmcmVzaC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRheXMgcmVxdWVzdGVkIGluIHRoZSBtb3N0IHJlY2VudGx5IGdlbmVyYXRlZCBiYW5rIGluY29tZSByZXBvcnQgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgaW5jb21lIHNvdXJjZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk/OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBTdW1tYXJ5IGZvciBiYW5rIGluY29tZSBhY3Jvc3MgYWxsIGluY29tZSBzb3VyY2VzIGFuZCBpdGVtcyAobWF4IGhpc3Rvcnkgb2YgNzMwIGRheXMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgYWNyb3NzIGFsbCB0aGUgaW5jb21lIHNvdXJjZXMgaW4gdGhlIGVuZCB1c2VyXFwncyBJdGVtcyBmb3IgdGhlIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgcHJvYWN0aXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZWlyIGluY29tZSBjaGFuZ2VzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuYWJsZV93ZWJob29rczogYm9vbGVhbjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIGFib3V0IHRoZSBvd25lciBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lclxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHVzZXJcXCdzIGJhbmsgYWNjb3VudCByZWxhdGVkIHRvIGFuIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgb3duZXI6IENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGVyaW9kIG9iamVjdHMsIGNvbnRhaW5pbmcgbW9yZSBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBwZXJpb2RzOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Q+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgb24gdGhlIG92ZXJhbGwgcGVyaW9kIG9mIHRoZSBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0aW5nIGJhbGFuY2Ugb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBzdGFydGluZ19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIGVuZGluZ19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhhdCBtb25leSBtb3ZlZCBpbnRvIHRoZSBhY2NvdW50IChzdWNoIGFzIGEgcGF5Y2hlY2sgYmVpbmcgZGVwb3NpdGVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2Ygd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIG1hZGUsIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBhcyBpdCBhcHBlYXJzIG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycyBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGJhbmsgc3RhdGVtZW50IHVwbG9hZCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY3JlZGl0IGNhcmQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgbGlhYmlsaXR5IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhcmlvdXMgaW50ZXJlc3QgcmF0ZXMgdGhhdCBhcHBseSB0byB0aGUgYWNjb3VudC4gQVBSIGluZm9ybWF0aW9uIGlzIG5vdCBwcm92aWRlZCBieSBhbGwgY2FyZCBpc3N1ZXJzOyBpZiBBUFIgZGF0YSBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGFycmF5IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PEFQUj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhcHJzOiBBcnJheTxBUFI+O1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2lzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBwYXltZW50IGR1ZSBmb3IgdGhlIG5leHQgYmlsbGluZyBjeWNsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgY3JlZGl0IHVzZSBjYXNlcywgYnV0IG5vdCBsaW1pdGVkIHRvIHN1Y2ggdXNlIGNhc2VzLiAgU2VlIHRoZSBbYHRheG9ub215IGNzdiBmaWxlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NyZWRpdC1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBjcmVkaXQgY2F0ZWdvcmllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0Q2F0ZWdvcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBoaWdoIGxldmVsIGNhdGVnb3J5IHRoYXQgY29tbXVuaWNhdGVzIHRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBncmFudWxhciBjYXRlZ29yeSBjb252ZXlpbmcgdGhlIHRyYW5zYWN0aW9uXFwncyBpbnRlbnQuIFRoaXMgZmllbGQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2F0ZWdvcnlcbiAgICAgKi9cbiAgICBkZXRhaWxlZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZG9jdW1lbnQuICBgUEFZU1RVQmA6IEEgcGF5c3R1Yi4gIGBCQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgVVNfVEFYX1cyYDogQSBXLTIgd2FnZSBhbmQgdGF4IHN0YXRlbWVudCBwcm92aWRlZCBieSBhIFVTIGVtcGxveWVyIHJlZmxlY3Rpbmcgd2FnZXMgZWFybmVkIGJ5IHRoZSBlbXBsb3llZS4gIGBVU19NSUxJVEFSWV9FUkFTYDogQW4gZWxlY3Ryb25pYyBSZXRpcmVtZW50IEFjY291bnQgU3RhdGVtZW50IChlUkFTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0NMRVNgOiBBIENpdmlsaWFuIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0bWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgZmlsZS4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBmaWxlIG1heSBub3QgYmUgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYC4gSWYgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZ2VuZXJhdGUgYSBQREYgaWYgdGhlIG9yaWdpbmFsIGlzIG5vdCBhdmFpbGFibGUsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIEZvciBEb2N1bWVudCBJbmNvbWUsIHRoaXMgZmllbGQgd2lsbCBub3QgYmUgYG51bGxgLCBhbmQgdGhlIGZpbGUgdHlwZSB3aWxsIGJlIHRoZSBvcmlnaW5hbCBmaWxlIHR5cGUgdXBsb2FkZWQgYnkgdGhlIHVzZXIuIEZvciBtb3JlIGRldGFpbHMgb24gYXZhaWxhYmxlIGZpbGUgdHlwZXMsIHNlZSB0aGUgW0RvY3VtZW50IEluY29tZV0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaW5jb21lL3BheXJvbGwtaW5jb21lKSBkb2N1bWVudGF0aW9uLiAgVGhpcyBkb3dubG9hZCBVUkwgY2FuIG9ubHkgYmUgdXNlZCBvbmNlIGFuZCBleHBpcmVzIGFmdGVyIHR3byBtaW51dGVzLiBUbyBnZW5lcmF0ZSBhIG5ldyBkb3dubG9hZCBVUkwsIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBhZ2Fpbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG93bmxvYWRfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBvZiB0aGUgZG9jdW1lbnQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBkb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gIGBET0NVTUVOVF9FUlJPUmA6IFRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiBQb3NzaWJsZSBjYXVzZXMgaW5jbHVkZTogVGhlIGRvY3VtZW50IHdhcyBhbiB1bmFjY2VwdGFibGUgZG9jdW1lbnQgdHlwZSBzdWNoIGFzIGFuIG9mZmVyIGxldHRlciBvciBiYW5rIHN0YXRlbWVudCwgdGhlIGRvY3VtZW50IGltYWdlIHdhcyBjcm9wcGVkIG9yIGJsdXJyeSwgb3IgdGhlIGRvY3VtZW50IHdhcyBjb3JydXB0ZWQuICBgVU5LTk9XTmAgb3IgYG51bGxgOiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gSWYgdGhpcyBoYXBwZW5zIHJlcGVhdGVkbHksIGNvbnRhY3Qgc3VwcG9ydCBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIHVwbG9hZGVkIGRvY3VtZW50IChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBwYWdlX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGVtcGxveW1lbnQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95bWVudCBpdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVG9rZW4gdG8gcmVwcmVzZW50IHRoZSB1bmRlcmx5aW5nIEVtcGxveW1lbnQgZGF0YVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBlbXBsb3ltZW50IGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGl0bGUgb2YgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkczogQ3JlZGl0UGxhdGZvcm1JZHM7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1wbG95bWVudCBmb3IgdGhlIGluZGl2aWR1YWwuIGBcXFwiRlVMTF9USU1FXFxcImA6IEEgZnVsbC10aW1lIGVtcGxveWVlLiBgXFxcIlBBUlRfVElNRVxcXCJgOiBBIHBhcnQtdGltZSBlbXBsb3llZS4gYFxcXCJDT05UUkFDVE9SXFxcImA6IEFuIGVtcGxveWVlIHR5cGljYWxseSBoaXJlZCBleHRlcm5hbGx5IHRocm91Z2ggYSBjb250cmFjdGluZyBncm91cC4gYFxcXCJURU1QT1JBUllcXFwiYDogQSB0ZW1wb3JhcnkgZW1wbG95ZWUuIGBcXFwiT1RIRVJcXFwiYDogVGhlIGVtcGxveWVlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5lZCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZWVfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZW1wbG95ZWVcXCdzIG1vc3QgcmVjZW50IHBheXN0dWIgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9wYXlzdHViX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0RFVEFJTDogQXNzZXREZXRhaWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0T3duZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfSE9MREVSOiBBc3NldEhvbGRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmFsaWRhdGlvblNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIFZBTElEQVRJT05fU09VUkNFUzogVmFsaWRhdGlvblNvdXJjZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcuLi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVUQUlMOiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVNDUklQVElPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXQ+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBMYXN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaWRkbGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBNaWRkbGVOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9ydGdhZ2UgbG9hbiBhZ3JlZW1lbnQgYmV0d2VlbiBvbmUgb3IgbW9yZSBib3Jyb3dlcnMgYW5kIGEgbW9ydGdhZ2UgbGVuZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgbG9hbi4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJTdWJqZWN0TG9hblxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hblxuICAgICAqL1xuICAgIExvYW5Sb2xlVHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbklkZW50aWZpZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBBcnJheTxMb2FuSWRlbnRpZmllcj47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2Fuc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBDcmVkaXRGcmVkZGllTWFjTG9hbjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcGFydGllcyB0byBhIGRlYWwuIFRoaXMgaW5jbHVkZXMgdGhlIGRpcmVjdCBwYXJ0aWNpcGF0aW5nIHBhcnRpZXMsIHN1Y2ggYXMgYm9ycm93ZXIgYW5kIHNlbGxlciBhbmQgdGhlIGluZGlyZWN0IHBhcnRpZXMgc3VjaCBhcyB0aGUgY3JlZGl0IHJlcG9ydCBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0RGF0ZVRpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLiBUaGUgdmFsdWUgY2FuIG9ubHkgYmUgXFxcIlJlcG9ydElEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydElkZW50aWZpZXJUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvblBhcmVudElkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgREVBTDogQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyAoVk9BKSBzY2hlbWEgdmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgU2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZm9yIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgVkVSSUZJQ0FUSU9OX09GX0FTU0VUX1JFU1BPTlNFOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBzY2hlbWEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgTE9BTlM6IENyZWRpdEZyZWRkaWVNYWNMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnRpZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBDcmVkaXRGcmVkZGllTWFjUGFydGllcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgU0VSVklDRVM6IENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkRlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZWFybmluZ3M6IENyZWRpdFBheVN0dWJFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1Yk5ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IENyZWRpdFBheVN0dWJOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlTdHViUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheSBzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkVhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYFNJTkdMRWAgb3IgYE1BUlJJRURgIG9yIGBOT1QgTElTVEVEYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlRheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkOiBQYXlTdHViVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5IHN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBleHBsaWNpdCBwYXkgYmFzaXMgb24gdGhlIHBheXN0dWIgKGlmIHByZXNlbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgSG91cmx5ID0gJ0hPVVJMWScsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJ1xufVxuXG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBib2R5IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB0byBiZSByZWZyZXNoZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHdoZXJlIFBsYWlkIHdpbGwgc2VuZCB0aGUgcGF5cm9sbCBpbmNvbWUgcmVmcmVzaCB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJVU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uIGBcXFwiU1VDQ0VTU0ZVTFxcXCJgIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggd2FzIHN1Y2Nlc3NmdWwuIGBcXFwiTk9UX0ZPVU5EXFxcImAgTm8gbmV3IGRhdGEgd2FzIGZvdW5kIGFmdGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yZWZyZXNoX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuIHN0cmluZ3MsIHdpdGggYXQgbW9zdCBvbmUgdG9rZW4gb2YgZWFjaCByZXBvcnQgdHlwZS4gQ3VycmVudGx5IG9ubHkgQXNzZXQgUmVwb3J0IHRva2VuIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY29uZGFyeV9jbGllbnRfaWRgIGlzIHRoZSBjbGllbnQgaWQgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgcmVsYXkgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgd2ViaG9va3Mgd2hlbiB0aGUgU2Vjb25kYXJ5IENsaWVudCBzdWNjZXNzZnVsbHkgcmV0cmlldmVzIGFuIEFzc2V0IFJlcG9ydCBieSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgdG8gYWxsb3cgdGhlbSB0byBhY2Nlc3MgdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyB3aGVuIHRoZSByZXBvcnQgb2YgYSByZWxheSB0b2tlbiBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSByZWxheSB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhbmQgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgQmFuayBFbXBsb3ltZW50IExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBlbXBsb3ltZW50LiAgYE5PX0VNUExPWU1FTlRTX0ZPVU5EYDogV2UgYXR0ZW1wdGVkLCBidXQgd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgZW1wbG95bWVudCBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgRU1QTE9ZRVJfTk9UX0xJU1RFRGA6IFRoZSB1c2VyIGV4cGxpY2l0bHkgaW5kaWNhdGVkIHRoYXQgdGhleSBkaWQgbm90IHNlZSB0aGVpciBjdXJyZW50IG9yIHByZXZpb3VzIGVtcGxveWVyIGluIHRoZSBsaXN0IG9mIGVtcGxveWVyIG5hbWVzIGZvdW5kLiAgYFNUQVJURURgOiBUaGUgdXNlciBiZWdhbiB0aGUgYmFuayBpbmNvbWUgcG9ydGlvbiBvZiB0aGUgbGluayBmbG93LiAgYElOVEVSTkFMX0VSUk9SYDogVGhlIHVzZXIgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBOb0VtcGxveWVyc0ZvdW5kID0gJ05PX0VNUExPWUVSU19GT1VORCcsXG4gICAgRW1wbG95ZXJOb3RMaXN0ZWQgPSAnRU1QTE9ZRVJfTk9UX0xJU1RFRCdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1cz86IENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBCYW5rIEluY29tZSBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgaW5jb21lICBgTk9fREVQT1NJVFNfRk9VTkRgOiBXZSBhdHRlbXB0ZWQsIGJ1dCB3ZXJlIHVuYWJsZSB0byBmaW5kIGFueSBpbmNvbWUgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYFVTRVJfUkVQT1JURURfTk9fSU5DT01FYDogVGhlIHVzZXIgZXhwbGljaXRseSBpbmRpY2F0ZWQgdGhhdCB0aGV5IGRvblxcJ3QgcmVjZWl2ZSBpbmNvbWUgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYFNUQVJURURgOiBUaGUgdXNlciBiZWdhbiB0aGUgYmFuayBpbmNvbWUgcG9ydGlvbiBvZiB0aGUgbGluayBmbG93LiAgYElOVEVSTkFMX0VSUk9SYDogVGhlIHVzZXIgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1cyB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIE5vRGVwb3NpdHNGb3VuZCA9ICdOT19ERVBPU0lUU19GT1VORCcsXG4gICAgVXNlclJlcG9ydGVkTm9JbmNvbWUgPSAnVVNFUl9SRVBPUlRFRF9OT19JTkNPTUUnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBMaW5rIGVycm9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25FcnJvciB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYW4gSXRlbSBhZGQgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5lZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXlzdHVicyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW5zdGl0dXRpb24gTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2V0IG9mIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgSXRlbSBhZGRzIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgaXRlbV9hZGRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pbmNvbWVfcmVzdWx0cz86IENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIGZvciB0aGUgdXNlci4gU2Vzc2lvbnMgd2lsbCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlc3Npb25zPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0VzJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFcyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRheF95ZWFyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfOTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94XzEyOiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlczogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdGllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0ZWQgbGlrZWxpaG9vZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiwgaWYgaW5pdGlhdGVkLCB3aWxsIGJlIHN1YmplY3QgdG8gYSByZXR1cm4uICBJbiB0aGUgYGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZml2ZSByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDAlIC0gMC4wMiUgICAyOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDIlIC0gMC4wNSUgICAzOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDUlIC0gMC4xJSAgIDQ6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4xJSAtIDAuNSUgICA1OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gMC41JSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHRlYW0gbWVtYmVyIHdpdGggYWNjZXNzIHRvIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBkYXNoYm9hcmQgdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHR5cGUge0FycmF5PERhc2hib2FyZFVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJzOiBBcnJheTxEYXNoYm9hcmRVc2VyPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEYXNoYm9hcmRVc2VyU3RhdHVzIHtcbiAgICBJbnZpdGVkID0gJ2ludml0ZWQnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIERlYWN0aXZhdGVkID0gJ2RlYWN0aXZhdGVkJ1xufVxuXG4vKipcbiAqIEEgZGF0ZSByYW5nZSB3aXRoIGEgc3RhcnQgYW5kIGVuZCBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhdGVSYW5nZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhdGVSYW5nZVxuICAgICAqL1xuICAgIGJlZ2lubmluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsOiBEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNUb3RhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSB0b3RhbCBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGRldGVjdGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIHRoZSB3ZWJob29rIHJlbGF0ZXMgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF91c2VyOiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtIHtcbiAgICBVcyA9ICdVUycsXG4gICAgQ2EgPSAnQ0EnXG59XG5cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjY2VzcyB0b2tlbiBmb3IgdGhlIHRhcmdldCBJdGVtLCB0eXBpY2FsbHkgcHJvdmlkZWQgaW4gdGhlIEltcG9ydCBJdGVtIHJlc3BvbnNlLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZCBBY2NvdW50IElEIHRoYXQgc3BlY2lmaWVzIHRoZSB0YXJnZXQgYmFuayBhY2NvdW50LiBUaGlzIGFjY291bnQgd2lsbCBiZWNvbWUgdGhlIHJlY2lwaWVudCBmb3IgYSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIGNhbm5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdHJhbnNhY3Rpb24gaXRlbXMgdG8gdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBtYXRjaCB0aGUgdXNlciB0byB0aGVpciBQYXlyb2xsIFByb3ZpZGVyLiBUaGVzZSB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBzYW1lIGNsaWVudCBpZCBhcyB0aGUgb25lIGNyZWF0aW5nIHRoZSBzd2l0Y2gsIGFuZCBoYXZlIGFjY2VzcyB0byB0aGUgdHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2l0ZW1fYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiREVQT1NJVF9TV0lUQ0hcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFxcXCJTV0lUQ0hfU1RBVEVfVVBEQVRFXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgYGluaXRpYWxpemVkYDogVGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIHVzZXIgZW50ZXJpbmcgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHN1Ym1pdCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBwcm9jZXNzaW5nYDogVGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGJlZW4gc3VibWl0dGVkIGFuZCBpcyBiZWluZyBwcm9jZXNzZWQuICBgY29tcGxldGVkYDogVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgYW5kIGNvbXBsZXRlZCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBlcnJvcmA6IFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW0RlcG9zaXQgU3dpdGNoIEFQSSByZWZlcmVuY2VdKC9kb2NzL2RlcG9zaXQtc3dpdGNoL3JlZmVyZW5jZSNkZXBvc2l0X3N3aXRjaGdldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiBUaGUgZGVwb3NpdCBzd2l0Y2ggdGFyZ2V0IHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdpdmVuIG5hbWUgKGZpcnN0IG5hbWUpIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmYW1pbHkgbmFtZSAobGFzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBvZiB0aGUgdXNlci4gVGhlIGVuZHBvaW50IGNhbiBhY2NlcHQgYSB2YXJpZXR5IG9mIHBob25lIG51bWJlciBmb3JtYXRzLCBpbmNsdWRpbmcgRS4xNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZW1haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERlcG9zaXQgc3dpdGNoIHRva2VuLCB1c2VkIHRvIGluaXRpYWxpemUgTGluayBmb3IgdGhlIERlcG9zaXQgU3dpdGNoIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXhwaXJhdGlvbiB0aW1lIG9mIHRoZSB0b2tlbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogT3JpZ2luYXRvciBhbmQgdGhlaXIgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogQSBwb3NzaWJsZSBhY2NvdW50IGRldGVjdGVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERldGVjdGVkQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGV0ZWN0ZWRBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIGFjY291bnQgdHlwZSAoZGVwb3NpdG9yeSwgY3JlZGl0LCBsb2FuLCBpbnZlc3RtZW50IGV0Yy4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0ZWN0ZWQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9ucyB0by9mcm9tIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG5ld2VzdCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbn1cbi8qKlxuICogSGlnaCBsZXZlbCBzdW1tYXJ5IG9mIHdoZXRoZXIgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBtYXRjaGVzIHRoZSBmb3JtYXR0aW5nIHJ1bGVzIGFuZCBzZWN1cml0eSBjaGVja3MgZm9yIHRoZSBhc3NvY2lhdGVkIGp1cmlzZGljdGlvbi4gIEZvciBleGFtcGxlLCBtb3N0IGlkZW50aXR5IGRvY3VtZW50cyBoYXZlIGZvcm1hdHRpbmcgcnVsZXMgbGlrZSB0aGUgZm9sbG93aW5nOiAgIFRoZSBpbWFnZSBvZiB0aGUgcGVyc29uXFwncyBmYWNlIG11c3QgaGF2ZSBhIGNlcnRhaW4gY29udHJhc3QgaW4gb3JkZXIgdG8gaGlnaGxpZ2h0IHNraW4gdG9uZSAgIFRoZSBzdWJqZWN0IGluIHRoZSBkb2N1bWVudFxcJ3MgaW1hZ2UgbXVzdCByZW1vdmUgZXllIGdsYXNzZXMgYW5kIHBvc2UgaW4gYSBjZXJ0YWluIHdheSAgIFRoZSBpbmZvcm1hdGlvbmFsIGZpZWxkcyAobmFtZSwgZGF0ZSBvZiBiaXJ0aCwgSUQgbnVtYmVyLCBldGMuKSBtdXN0IGJlIGNvbG9yZWQgYW5kIGFsaWduZWQgYWNjb3JkaW5nIHRvIHNwZWNpZmljIHJ1bGVzICAgU2VjdXJpdHkgZmVhdHVyZXMgbGlrZSB3YXRlcm1hcmtzIGFuZCBiYWNrZ3JvdW5kIHBhdHRlcm5zIG11c3QgYmUgcHJlc2VudCAgU28gYSBgbWF0Y2hgIHN0YXR1cyBmb3IgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgZG9jdW1lbnQgaW4gdGhlIHByb3ZpZGVkIGltYWdlIHNlZW1zIHRvIGNvbmZvcm0gdG8gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBhbmQgc2VjdXJpdHkgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXRlY3RlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50QXV0aGVudGljaXR5TWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEEgbWF0Y2ggc3VtbWFyeSBkZXNjcmliaW5nIHRoZSBjcm9zcyBjb21wYXJpc29uIGJldHdlZW4gdGhlIHN1YmplY3RcXCdzIGRhdGUgb2YgYmlydGgsIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZSwgYW5kIHRoZSBkYXRlIG9mIGJpcnRoIHRoZXkgc2VwYXJhdGVseSBwcm92aWRlZCB0byB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBtZXRhZGF0YSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHRoYXQgaXMgYWxzbyBwcmVzZW50IGluIHRoZSBwYXlzdHViIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY1R5cGV9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2NfdHlwZT86IERvY1R5cGU7XG59XG4vKipcbiAqIEEgbWF0Y2ggc3VtbWFyeSBkZXNjcmliaW5nIHRoZSBjcm9zcyBjb21wYXJpc29uIGJldHdlZW4gdGhlIHN1YmplY3RcXCdzIG5hbWUsIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZSwgYW5kIHRoZSBuYW1lIHRoZXkgc2VwYXJhdGVseSBwcm92aWRlZCB0byBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50TmFtZU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBjZXJ0YWluIHJlYXNvbiBhcyB0byB3aHkgYSBkb2N1bWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBmcmF1ZHVsZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHQgZnJvbSB0aGUgcmlzayBzaWduYWwgY2hlY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgd2hpY2ggdGhlIHJpc2sgc2lnbmFsIHdhcyBjb21wdXRlZCBmb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBmaWVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdXNlZCB0byBxdWlja2x5IGlkZW50aWZ5IGlmIHRoZSBzaWduYWwgaW5kaWNhdGVzIHRoYXQgdGhpcyBmaWVsZCBpcyBhdXRoZW50aWMgb3IgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzazogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX21ldGFkYXRhOiBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIGZpZWxkLCBhcyBzZWVuIG9uIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGV4cGVjdGVkX3ZhbHVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXJpdmVkIHZhbHVlIG9idGFpbmVkIGluIHRoZSByaXNrIHNpZ25hbCBjYWxjdWxhdGlvbiBwcm9jZXNzIGZvciB0aGlzIGZpZWxkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgYWN0dWFsX3ZhbHVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGludG8gdGhlIHBhcnRpY3VsYXIgcmlzayBzaWduYWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBzaWduYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHBhZ2VfbnVtYmVyOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWRkaXRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgaW5zdGl0dXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2ZXJpZmljYXRpb24gYXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIGZvciBhIHNldCBvZiBpbmNvbWUgZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBkb2N1bWVudCBtZXRhZGF0YSBhbmQgYXNzb2NpYXRlZCByaXNrIHNpZ25hbHMgcGVyIGRvY3VtZW50XG4gICAgICogQHR5cGUge0FycmF5PFNpbmdsZURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBzaW5nbGVfZG9jdW1lbnRfcmlza19zaWduYWxzOiBBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHJpc2sgc2lnbmFscyBjb21wdXRlZCBmcm9tIGEgc2V0IG9mIHVwbG9hZGVkIGRvY3VtZW50cyBhbmQgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnRzXFwnIG1ldGFkYXRhXG4gICAgICogQHR5cGUge0FycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIG11bHRpX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8TXVsdGlEb2N1bWVudFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBBIHN1bW1hcnkgYWNyb3NzIGFsbCByaXNrIHNpZ25hbHMgYXNzb2NpYXRlZCB3aXRoIGEgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwLCBpbmNsdXNpdmUsIHdoZXJlIGEgc2NvcmUgY2xvc2VyIHRvIDAgaW5kaWNhdGVzIGEgZG9jdW1lbnQgaXMgbGlrZWx5IHRvIGJlIHRydXN0d29ydGh5IGFuZCBhIHNjb3JlIGNsb3NlciB0byAxMDAgaW5kaWNhdGVzIGEgZG9jdW1lbnQgaXMgbGlrZWx5IHRvIGJlIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgZG9jdW1lbnQgc3VibWlzc2lvbi4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnXG59XG5cbi8qKlxuICogRGF0YSwgaW1hZ2VzLCBhbmFseXNpcywgYW5kIHJlc3VsdHMgZnJvbSB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkb2N1bWVudHMgc3VibWl0dGVkIHRvIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbiwgd2hlcmUgZWFjaCBzdWJtaXNzaW9uIHdpbGwgY29udGFpbiBib3RoIGEgZnJvbnQgYW5kIGJhY2sgaW1hZ2UsIG9yIGp1c3QgYSBmcm9udCBpbWFnZSwgZGVwZW5kaW5nIG9uIHRoZSBkb2N1bWVudCB0eXBlLiAgTm90ZTogUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGxldCBhIHVzZXIgc3VibWl0IGEgbmV3IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgdXAgdG8gdGhyZWUgdGltZXMgaWYgd2UgZGV0ZWN0IHRoYXQgYSBwcmV2aW91cyBhdHRlbXB0IG1pZ2h0IGhhdmUgZmFpbGVkIGR1ZSB0byB1c2VyIGVycm9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgYXJlIGJsdXJyeSBvciBvYnNjdXJlZCBieSBnbGFyZSwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCB0byBjYXB0dXJlIHRoZWlyIGRvY3VtZW50cyBhZ2FpbiwgcmVzdWx0aW5nIGluIGF0IGxlYXN0IHR3byBzZXBhcmF0ZSBlbnRyaWVzIHdpdGhpbiBgZG9jdW1lbnRzYC4gSWYgdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaXMgYGZhaWxlZGAsIHRoZSB1c2VyIGhhcyBleGhhdXN0ZWQgdGhlaXIgcmV0cnkgYXR0ZW1wdHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50czogQXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD47XG59XG4vKipcbiAqIEltYWdlcywgZXh0cmFjdGVkIGRhdGEsIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3MgaWRlbnRpdHkgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IGRvY3VtZW50IHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50SW1hZ2VzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgaW1hZ2VzOiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhbmFseXNpczogRG9jdW1lbnRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5ncyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8RWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgQmFzaWNBbGxvd2FuY2VIb3VzaW5nID0gJ0JBU0lDIEFMTE9XQU5DRSBIT1VTSU5HJyxcbiAgICBCYXNpY0FsbG93YW5jZVN1YnNpc3RlbmNlID0gJ0JBU0lDIEFMTE9XQU5DRSBTVUJTSVNURU5DRScsXG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbWFpbCBhZGRyZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbWFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGVtYWlsIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbWFpbCBhY2NvdW50IGFzIGRlc2NyaWJlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgdHlwZTogRW1haWxUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFbWFpbFR5cGVFbnVtIHtcbiAgICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxuICAgIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGVtYWlsIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgZW1haWwgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIGVtYWlsLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIGVtYWlsIHdpdGggZGlmZmVyZW50IFxcJytcXCcgZXh0ZW5zaW9ucyksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBlbWFpbCBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IEFkZHJlc3NEYXRhTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGZyb20gMCB0byAxIGluZGljYXRpbmcgUGxhaWRcXCdzIGxldmVsIG9mIGNvbmZpZGVuY2UgaW4gdGhlIHBhaXJpbmcgYmV0d2VlbiB0aGUgZW1wbG95ZXIgYW5kIHRoZSBpbnN0aXR1dGlvbiAobm90IHlldCBpbXBsZW1lbnRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX3Njb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciwgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBuYW1lIHRvIGJlIHNlYXJjaGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgcHJvZHVjdHMgdGhlIHJldHVybmVkIGVtcGxveWVycyBzaG91bGQgc3VwcG9ydC4gQ3VycmVudGx5LCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGBcXFwiZGVwb3NpdF9zd2l0Y2hcXFwiYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3llcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyczogQXJyYXk8RW1wbG95ZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBlbXBsb3ltZW50IGRldGFpbHMgZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRTb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWxcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzPzogRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzPzogUGxhdGZvcm1JZHM7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gc3VtbWFyaWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBFbXBsb3ltZW50U3RhdHVzQWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0FDVElWRScsXG4gICAgRW1wbG95bWVudFN0YXR1c0luYWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0lOQUNUSVZFJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5oYW5jZW1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbmhhbmNlbWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VtZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDaGFubmVsfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PENvdW50ZXJwYXJ0eT47XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhY2NvdW50IGhvbGRlcjogIGBPVVRGTE9XYCAtIEluY2x1ZGVzIG91dGdvaW5nIHRyYW5zZmVycywgcHVyY2hhc2VzLCBhbmQgZmVlcy4gKFR5cGljYWxseSByZXByZXNlbnRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNoZWNraW5nIGFjY291bnRzIGFuZCBkZWJpdCBjYXJkcyBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjcmVkaXQgY2FyZHMuKSAgYElORkxPV2AgLSBJbmNsdWRlcyBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMsIGFuZCBpbmNvbWUuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgbmVnYXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLilcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uIHtcbiAgICBJbmZsb3cgPSAnSU5GTE9XJyxcbiAgICBPdXRmbG93ID0gJ09VVEZMT1cnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5yaWNobWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVucmljaG1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnJpY2htZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzOiBBcnJheTxDb3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGZvciB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiB0byBvYnRhaW4gdGhlIGJlc3QgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgbGVnYWN5IGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhY3lfY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5X2NvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmVuY2V9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcmVjdXJyZW5jZT86IFJlY3VycmVuY2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2ZmaWNpYWwgZG9jdW1lbnQsIHVzdWFsbHkgaXNzdWVkIGJ5IGEgZ292ZXJuaW5nIGJvZHkgb3IgaW5zdGl0dXRpb24sIHdpdGggYW4gYXNzb2NpYXRlZCBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlEb2N1bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIHR5cGU6IEVudGl0eURvY3VtZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaWtgIC0gUnVzc2lhbiBiYW5rIGNvZGUgIGBidXNpbmVzc19udW1iZXJgIC0gQSBudW1iZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBidXNpbmVzcyB3aXRoaW4gYSBjYXRlZ29yeSBvZiBidXNpbmVzc2VzICBgaW1vYCAtIE51bWJlciBhc3NpZ25lZCB0byB0aGUgZW50aXR5IGJ5IHRoZSBJbnRlcm5hdGlvbmFsIE1hcml0aW1lIE9yZ2FuaXphdGlvbiAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgc3dpZnRgIC0gTnVtYmVyIGlkZW50aWZ5aW5nIGEgYmFuayBhbmQgYnJhbmNoLiAgYHRheF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbGxlY3RpbmcgdGF4ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eURvY3VtZW50VHlwZSB7XG4gICAgQmlrID0gJ2JpaycsXG4gICAgQnVzaW5lc3NOdW1iZXIgPSAnYnVzaW5lc3NfbnVtYmVyJyxcbiAgICBJbW8gPSAnaW1vJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgU3dpZnQgPSAnc3dpZnQnLFxuICAgIFRheElkID0gJ3RheF9pZCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgZW50aXR5IGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50cz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc2VzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICB1cmxzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZW50aXR5IHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AgdGhhdCB3ZXJlIGNvbXBhcmVkIHdoZW4gdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gZW50aXR5IHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgLCB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IEFycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz47XG4gICAgLyoqXG4gICAgICogVVJMcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHVybHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXM+O1xufVxuLyoqXG4gKiBBbmFseXplZCBkb2N1bWVudHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5RG9jdW1lbnQ7XG59XG4vKipcbiAqIEVtYWlsIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNob3J0aGFuZCBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHNjcmVlbmluZyBsaXN0IGZvciBlbnRpdGllcy4gIGBBVV9DT05gOiBBdXN0cmFsaWEgRGVwYXJ0bWVudCBvZiBGb3JlaWduIEFmZmFpcnMgYW5kIFRyYWRlIENvbnNvbGlkYXRlZCBMaXN0ICBgQ0FfQ09OYDogR292ZXJubWVudCBvZiBDYW5hZGEgQ29uc29saWRhdGVkIExpc3Qgb2YgU2FuY3Rpb25zICBgRVVfQ09OYDogRXVyb3BlYW4gRXh0ZXJuYWwgQWN0aW9uIFNlcnZpY2UgQ29uc29saWRhdGVkIExpc3QgIGBJWl9TT0VgOiBTdGF0ZSBPd25lZCBFbnRlcnByaXNlIExpc3QgIGBJWl9VTkNgOiBVbml0ZWQgTmF0aW9ucyBDb25zb2xpZGF0ZWQgU2FuY3Rpb25zICBgSVpfV0JLYDogV29ybGQgQmFuayBMaXN0aW5nIG9mIEluZWxpZ2libGUgRmlybXMgYW5kIEluZGl2aWR1YWxzICBgVVNfQ0FQYDogVVMgT0ZBQyBDb3JyZXNwb25kZW50IEFjY291bnQgb3IgUGF5YWJsZS1UaHJvdWdoIEFjY291bnQgU2FuY3Rpb25zICBgVVNfRlNFYDogVVMgT0ZBQyBGb3JlaWduIFNhbmN0aW9ucyBFdmFkZXJzICBgVVNfTUJTYDogVVMgTm9uLVNETiBNZW51LUJhc2VkIFNhbmN0aW9ucyAgYFVTX1NETmA6IFVTIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgVVNfQ01DYDogVVMgT0ZBQyBOb24tU0ROIENoaW5lc2UgTWlsaXRhcnktSW5kdXN0cmlhbCBDb21wbGV4IExpc3QgIGBVU19VVkxgOiBCdXJlYXUgb2YgSW5kdXN0cnkgYW5kIFNlY3VyaXR5IFVudmVyaWZpZWQgTGlzdCAgYFVLX0hNQ2A6IFVLIEhNIFRyZWFzdXJ5IENvbnNvbGlkYXRlZCBMaXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlXYXRjaGxpc3RDb2RlIHtcbiAgICBDYUNvbiA9ICdDQV9DT04nLFxuICAgIEV1Q29uID0gJ0VVX0NPTicsXG4gICAgSXpTb2UgPSAnSVpfU09FJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVXNDYXAgPSAnVVNfQ0FQJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzTWJzID0gJ1VTX01CUycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFVzQ21jID0gJ1VTX0NNQycsXG4gICAgVXNVdmwgPSAnVVNfVVZMJyxcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIFVrSG1jID0gJ1VLX0hNQydcbn1cblxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGVudGl0aWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEVudGl0eVdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIGVudGl0eSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgT3JnYW5pemF0aW9uc1xcXCIgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEVudGl0eVdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IHVzZWQgZm9yIHNlYXJjaGluZyBhZ2FpbnN0IHdhdGNobGlzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQgd2FzIGV4cGlyZWQgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIHdhcyBwZXJmb3JtZWQuICBOb3RlOiBJbiB0aGUgY2FzZSB3aGVyZSBhbiBleHBpcmF0aW9uIGRhdGUgaXMgbm90IHByZXNlbnQgb24gdGhlIGRvY3VtZW50IG9yIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFeHBpcmF0aW9uRGF0ZSB7XG4gICAgTm90RXhwaXJlZCA9ICdub3RfZXhwaXJlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIHBheW1lbnQgY29uc2VudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gcmVxdWVzdCByZWZ1bmQgZGV0YWlscyBmcm9tIHRoZSBwYXllZVxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgU3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCB3aWxsIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLiAgSWYgcmVmdW5kIGRldGFpbHMgY291bGQgYmUgcmV0cmlldmVkLCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQgaWYgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgYmFjcz86IFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgZXh0ZXJuYWwgcGF5bWVudCByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBiYWNzOiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWw/OiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVHlwZXMgb2YgZG9jdW1lbnQgZm9ybWF0cy4gKFN1Z2dlc3RlZCB2YWx1ZXMpXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhDb250ZW50VHlwZXMge1xuICAgIEFwcGxpY2F0aW9uUGRmID0gJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgSW1hZ2VHaWYgPSAnaW1hZ2UvZ2lmJyxcbiAgICBJbWFnZUpwZWcgPSAnaW1hZ2UvanBlZycsXG4gICAgSW1hZ2VUaWZmID0gJ2ltYWdlL3RpZmYnLFxuICAgIEltYWdlUG5nID0gJ2ltYWdlL3BuZycsXG4gICAgQXBwbGljYXRpb25Kc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nXG59XG5cbi8qKlxuICogRmluYW5jaWFsIEluc3RpdHV0aW9uIHByb3ZpZGVyLXNwZWNpZmljIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgYXR0cmlidXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYXR0cmlidXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBSRVNUIGFwcGxpY2F0aW9uIGNvbnN0cmFpbnQgKEh5cGVybWVkaWEgQXMgVGhlIEVuZ2luZSBPZiBBcHBsaWNhdGlvbiBTdGF0ZSlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYSGF0ZW9hc0xpbmtcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rIHtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gaW52b2tlIHRoZSBhY3Rpb24gb24gdGhlIHJlc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBocmVmOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rQWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGFjdGlvbj86IEZEWEhhdGVvYXNMaW5rQWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFJlbGF0aW9uIG9mIHRoaXMgbGluayB0byBpdHMgY29udGFpbmluZyBlbnRpdHksIGFzIGRlZmluZWQgYnkgYW5kIHdpdGggbWFueSBleGFtcGxlIHJlbGF0aW9uIHZhbHVlcyBhdCBbSUVURiBSRkM1OTg4XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU5ODgpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICByZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udGVudC10eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnRlbnRUeXBlcz59XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgdHlwZXM/OiBBcnJheTxGRFhDb250ZW50VHlwZXM+O1xufVxuLyoqXG4gKiBIVFRQIE1ldGhvZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhIYXRlb2FzTGlua0FjdGlvbiB7XG4gICAgR2V0ID0gJ0dFVCcsXG4gICAgUG9zdCA9ICdQT1NUJyxcbiAgICBQYXRjaCA9ICdQQVRDSCcsXG4gICAgRGVsZXRlID0gJ0RFTEVURScsXG4gICAgUHV0ID0gJ1BVVCdcbn1cblxuLyoqXG4gKiBJbml0aWF0b3IgRmkgQXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU/OiBGRFhQYXJ0eVR5cGU7XG59XG4vKipcbiAqIFByb3ZpZGVzIHRoZSBiYXNlIGZpZWxkcyBvZiBhIG5vdGlmaWNhdGlvbi4gQ2xpZW50cyB3aWxsIHJlYWQgdGhlIGB0eXBlYCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJZCBvZiBub3RpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25JZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBGRFhOb3RpZmljYXRpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIElTTyA4NjAxIGRhdGUtdGltZSBpbiBmb3JtYXQgXFwnWVlZWS1NTS1ERFRoaDptbTpzcy5ubm5bWnxbK3wtXWhoOm1tXVxcJyBhY2NvcmRpbmcgdG8gW0lFVEYgUkZDMzMzOV0oaHR0cHM6Ly94bWwycmZjLnRvb2xzLmlldGYub3JnL3B1YmxpYy9yZmMvaHRtbC9yZmMzMzM5Lmh0bWwjYW5jaG9yMTQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VudE9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeTogRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblNldmVyaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZXZlcml0eT86IEZEWE5vdGlmaWNhdGlvblNldmVyaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25Qcmlvcml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBGRFhOb3RpZmljYXRpb25Qcmlvcml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHB1Ymxpc2hlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc3Vic2NyaWJlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25QYXlsb2FkfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25QYXlsb2FkOiBGRFhOb3RpZmljYXRpb25QYXlsb2FkO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhIYXRlb2FzTGlua31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdXJsPzogRkRYSGF0ZW9hc0xpbms7XG59XG4vKipcbiAqIENhdGVnb3J5IG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnkge1xuICAgIFNlY3VyaXR5ID0gJ1NFQ1VSSVRZJyxcbiAgICBNYWludGVuYW5jZSA9ICdNQUlOVEVOQU5DRScsXG4gICAgRnJhdWQgPSAnRlJBVUQnLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCcsXG4gICAgTmV3RGF0YSA9ICdORVdfREFUQSdcbn1cblxuLyoqXG4gKiBDdXN0b20ga2V5LXZhbHVlIHBhaXJzIHBheWxvYWQgZm9yIGEgbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIElEIGZvciB0aGUgb3JpZ2luYXRpb24gZW50aXR5IHJlbGF0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkVHlwZT86IEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEZEWEZpQXR0cmlidXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGN1c3RvbUZpZWxkcz86IEFycmF5PEZEWEZpQXR0cmlidXRlPjtcbn1cbi8qKlxuICogVHlwZSBvZiBlbnRpdHkgY2F1c2luZyBvcmlnaW5hdGlvbiBvZiBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZSB7XG4gICAgQWNjb3VudCA9ICdBQ0NPVU5UJyxcbiAgICBDdXN0b21lciA9ICdDVVNUT01FUicsXG4gICAgUGFydHkgPSAnUEFSVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogUHJpb3JpdHkgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25Qcmlvcml0eSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBNZWRpdW0gPSAnTUVESVVNJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFNldmVyaXR5IGxldmVsIG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHkge1xuICAgIEVtZXJnZW5jeSA9ICdFTUVSR0VOQ1knLFxuICAgIEFsZXJ0ID0gJ0FMRVJUJyxcbiAgICBXYXJuaW5nID0gJ1dBUk5JTkcnLFxuICAgIE5vdGljZSA9ICdOT1RJQ0UnLFxuICAgIEluZm8gPSAnSU5GTydcbn1cblxuLyoqXG4gKiBUeXBlIG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uVHlwZSB7XG4gICAgQ29uc2VudFJldm9rZWQgPSAnQ09OU0VOVF9SRVZPS0VEJyxcbiAgICBDb25zZW50VXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnLFxuICAgIEN1c3RvbSA9ICdDVVNUT00nLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJ1xufVxuXG4vKipcbiAqIEZEWCBQYXJ0aWNpcGFudCAtIGFuIGVudGl0eSBvciBwZXJzb24gdGhhdCBpcyBhIHBhcnQgb2YgYSBGRFggQVBJIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogSHVtYW4gcmVjb2duaXphYmxlIGNvbW1vbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVVJJIGZvciBwYXJ0eSwgd2hlcmUgYW4gZW5kIHVzZXIgY291bGQgbGVhcm4gbW9yZSBhYm91dCB0aGUgY29tcGFueSBvciBhcHBsaWNhdGlvbiBpbnZvbHZlZCBpbiB0aGUgZGF0YSBzaGFyaW5nIGNoYWluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBob21lVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgYSBsb2dvIGFzc2V0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgZW5kIHVzZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIGxvZ29Vcmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5UmVnaXN0cnl9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0cnk/OiBGRFhQYXJ0eVJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgbmFtZSBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJlZCBpZCBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eUlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgY29udGFpbmluZyB0aGUgcGFydHnigJlzIHJlZ2lzdHJhdGlvbiB3aXRoIG5hbWUgYW5kIGlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVJlZ2lzdHJ5IHtcbiAgICBGZHggPSAnRkRYJyxcbiAgICBHbGVpZiA9ICdHTEVJRicsXG4gICAgSWNhbm4gPSAnSUNBTk4nLFxuICAgIFByaXZhdGUgPSAnUFJJVkFURSdcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGEgcGFydHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFBhcnR5VHlwZSB7XG4gICAgRGF0YUFjY2Vzc1BsYXRmb3JtID0gJ0RBVEFfQUNDRVNTX1BMQVRGT1JNJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgRGF0YVJlY2lwaWVudCA9ICdEQVRBX1JFQ0lQSUVOVCcsXG4gICAgSW5kaXZpZHVhbCA9ICdJTkRJVklEVUFMJyxcbiAgICBNZXJjaGFudCA9ICdNRVJDSEFOVCcsXG4gICAgVmVuZG9yID0gJ1ZFTkRPUidcbn1cblxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaXMgYXV0b21hdGljYWxseSB2ZXJpZmllZCB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaGFzIGFuIGV4cGlyZWQgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgbWljcm8tZGVwb3NpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX0VYUElSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaWNyby1kZXBvc2l0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5zaWdodHMgc3Vycm91bmRpbmcgZXh0ZXJuYWwgZmluYW5jaWFsIGluc3RpdHV0aW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIEZvcm0gMTA5OSBUeXBlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGb3JtMTA5OVR5cGUge1xuICAgIFVua25vd24gPSAnRk9STV8xMDk5X1RZUEVfVU5LTk9XTicsXG4gICAgTWlzYyA9ICdGT1JNXzEwOTlfVFlQRV9NSVNDJyxcbiAgICBLID0gJ0ZPUk1fMTA5OV9UWVBFX0snXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgdGhlIGZyYXVkIG9yIGF0dGVtcHRlZCBmcmF1ZC4gYGZyYXVkX2Ftb3VudGAgc2hvdWxkIGJlIG9taXR0ZWQgdG8gaW5kaWNhdGUgYW4gdW5rbm93biBmcmF1ZCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZyYXVkQW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHZhbHVlLiBUaGlzIHZhbHVlIGNhbiBiZSAwIHRvIGluZGljYXRlIG5vIG1vbmV5IHdhcyBsb3N0LiBNdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiAoZS5nLiwgYDEuMjNgKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuYWx5emVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnM7XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBjYWxjdWxhdGVkIGhpc3RvcmljYWwgYmFsYW5jZSwgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZCBhbmQgUGxhaWQgaGFzIHByZXBhcmVkIGFzIG11Y2ggaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBkYXRhIGFzIHBvc3NpYmxlIGZvciB0aGUgSXRlbS4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgYmV5b25kIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gSWYgW0FjY291bnQgU2VsZWN0IHYyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvY3VzdG9taXphdGlvbi8jYWNjb3VudC1zZWxlY3QpIGlzIGVuYWJsZWQsIHRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQsIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBob2xkaW5nLCBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvc3QgYmFzaXMgb2YgdGhlIGhvbGRpbmcgKGUuZy4sIHRoZSB0b3RhbCBhbW91bnQgc3BlbnQgdG8gYWNxdWlyZSBhbGwgYXNzZXRzIGN1cnJlbnRseSBpbiB0aGUgaG9sZGluZykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGNvc3RfYmFzaXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgc2VjdXJpdHkgaXMgYW4gb3B0aW9uLCBgcXVhbnRpdHlgIHdpbGwgcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKHR5cGljYWxseSB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cyBtdWx0aXBsaWVkIGJ5IDEwMCksIG5vdCB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgaG9sZGluZ3MgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC4gVGhlIHdlYmhvb2sgdHlwaWNhbGx5IGZpcmVzIGluIHJlc3BvbnNlIHRvIGFueSBuZXdseSBhZGRlZCBob2xkaW5ncyBvciBwcmljZSBjaGFuZ2VzIHRvIGV4aXN0aW5nIGhvbGRpbmdzLCBtb3N0IGNvbW1vbmx5IGFmdGVyIG1hcmtldCBjbG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBIT0xESU5HU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVwZGF0ZWQgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1cGRhdGVkX2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGhvbGRpbmdzIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gXFwnc21zXFwnIHdpbGwgZGVsaXZlciB2aWEgU01TLiBNdXN0IHBhc3MgYHVzZXIucGhvbmVfbnVtYmVyYC4gXFwnZW1haWxcXCcgd2lsbCBkZWxpdmVyIHZpYSBlbWFpbC4gTXVzdCBwYXNzIGB1c2VyLmVtYWlsX2FkZHJlc3NgLiBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGlnbm9yZWQ7IHVzZSB0aGUgUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0byB0ZXN0IEhvc3RlZCBMaW5rIHNlc3Npb24gZGVsaXZlcnkgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Qge1xuICAgIFNtcyA9ICdzbXMnLFxuICAgIEVtYWlsID0gJ2VtYWlsJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGhvc3RlZCBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBIT1NURURfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYWwgc3RhdHVzIG9mIHRoZSBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbi4gV2lsbCBhbHdheXMgYmUgXFxcIk1BTlVBTExZX1ZFUklGSUVEXFxcIiBvciBcXFwiVkVSSUZJQ0FUSU9OX0ZBSUxFRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgZ2xvYmFsbHkgdW5pcXVlIGFuZCBodW1hbiByZWFkYWJsZSBJRCB0eXBlLCBzcGVjaWZpYyB0byB0aGUgY291bnRyeSBhbmQgZG9jdW1lbnQgY2F0ZWdvcnkuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSUROdW1iZXJUeXBlIHtcbiAgICBBckRuaSA9ICdhcl9kbmknLFxuICAgIEF1RHJpdmVyc0xpY2Vuc2UgPSAnYXVfZHJpdmVyc19saWNlbnNlJyxcbiAgICBBdVBhc3Nwb3J0ID0gJ2F1X3Bhc3Nwb3J0JyxcbiAgICBCckNwZiA9ICdicl9jcGYnLFxuICAgIENhU2luID0gJ2NhX3NpbicsXG4gICAgQ2xSdW4gPSAnY2xfcnVuJyxcbiAgICBDblJlc2lkZW50Q2FyZCA9ICdjbl9yZXNpZGVudF9jYXJkJyxcbiAgICBDb05pdCA9ICdjb19uaXQnLFxuICAgIERrQ3ByID0gJ2RrX2NwcicsXG4gICAgRWdOYXRpb25hbElkID0gJ2VnX25hdGlvbmFsX2lkJyxcbiAgICBFc0RuaSA9ICdlc19kbmknLFxuICAgIEVzTmllID0gJ2VzX25pZScsXG4gICAgSGtIa2lkID0gJ2hrX2hraWQnLFxuICAgIEluUGFuID0gJ2luX3BhbicsXG4gICAgSXRDZiA9ICdpdF9jZicsXG4gICAgSm9DaXZpbElkID0gJ2pvX2NpdmlsX2lkJyxcbiAgICBKcE15TnVtYmVyID0gJ2pwX215X251bWJlcicsXG4gICAgS2VIdWR1bWFOYW1iYSA9ICdrZV9odWR1bWFfbmFtYmEnLFxuICAgIEt3Q2l2aWxJZCA9ICdrd19jaXZpbF9pZCcsXG4gICAgTXhDdXJwID0gJ214X2N1cnAnLFxuICAgIE14UmZjID0gJ214X3JmYycsXG4gICAgTXlOcmljID0gJ215X25yaWMnLFxuICAgIE5nTmluID0gJ25nX25pbicsXG4gICAgTnpEcml2ZXJzTGljZW5zZSA9ICduel9kcml2ZXJzX2xpY2Vuc2UnLFxuICAgIE9tQ2l2aWxJZCA9ICdvbV9jaXZpbF9pZCcsXG4gICAgUGhQc24gPSAncGhfcHNuJyxcbiAgICBQbFBlc2VsID0gJ3BsX3Blc2VsJyxcbiAgICBSb0NucCA9ICdyb19jbnAnLFxuICAgIFNhTmF0aW9uYWxJZCA9ICdzYV9uYXRpb25hbF9pZCcsXG4gICAgU2VQaW4gPSAnc2VfcGluJyxcbiAgICBTZ05yaWMgPSAnc2dfbnJpYycsXG4gICAgVHJUY0tpbWxpayA9ICd0cl90Y19raW1saWsnLFxuICAgIFVzU3NuID0gJ3VzX3NzbicsXG4gICAgVXNTc25MYXN0NCA9ICd1c19zc25fbGFzdF80JyxcbiAgICBaYVNtYXJ0SWQgPSAnemFfc21hcnRfaWQnXG59XG5cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElTT0N1cnJlbmN5Q29kZSB7XG4gICAgVXNkID0gJ1VTRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIGlkZW50aXR5IGRhdGEgaGFzIGJlZW4gZGV0ZWN0ZWQgb24gYW4gSXRlbS4gSXRlbXMgYXJlIGNoZWNrZWQgZm9yIGlkZW50aXR5IHVwZGF0ZXMgZXZlcnkgMzAtOTAgZGF5cy4gV2UgcmVjb21tZW5kIHRoYXQgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rIHlvdSBtYWtlIGFub3RoZXIgY2FsbCB0byBgL2lkZW50aXR5L2dldGAgdG8gZmV0Y2ggdGhlIHVzZXJcXCdzIGxhdGVzdCBpZGVudGl0eSBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpZGVudGl0eSBhdHRyaWJ1dGVzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJQSE9ORVNcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9pZGVudGl0eTogeyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRG9jdW1lbnQgb2JqZWN0IHdpdGggbWV0YWRhdGEgb2YgdGhlIGRvY3VtZW50IHVwbG9hZGVkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBtYXRjaCBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZSwgcGhvbmUgbnVtYmVyLCBlbWFpbCBhZGRyZXNzIGFuZCBhZGRyZXNzIHVzZWQgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaC4gSWYgRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgaXMgZW5hYmxlZCBpbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QsIGxlYXZlIHRoaXMgZmllbGQgZW1wdHkgdG8gYXV0b21hdGljYWxseSBtYXRjaCBhZ2FpbnN0IFBJSSBjb2xsZWN0ZWQgZnJvbSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGNoZWNrcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGF1dG9maWxsZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb19ib3g6IFBPQm94U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzUHVycG9zZUxhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHR5cGU6IEFkZHJlc3NQdXJwb3NlTGFiZWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGV4cG9zZSBhIHNoYXJlYWJsZSBVUkwgZm9yIHRoZSB2ZXJpZmljYXRpb24gYmVpbmcgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGFncmVlZCB0byBhIHByaXZhY3kgcG9saWN5IHNwZWNpZnlpbmcgdGhhdCB0aGVpciBkYXRhIHdpbGwgYmUgc2hhcmVkIHdpdGggUGxhaWQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIElmIGBnYXZlX2NvbnNlbnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgc2tpcHBlZGAgYW5kIHRoZSBlbmQgdXNlclxcJ3Mgc2Vzc2lvbiB3aWxsIHN0YXJ0IGF0IHRoZSBuZXh0IHN0ZXAgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGdhdmVfY29uc2VudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZmxhZyBzcGVjaWZ5aW5nIGhvdyB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBoYW5kbGUgYXR0ZW1wdHMgdG8gY3JlYXRlIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aGVuIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGlkZW1wb3RlbmN5IGlzIGVuYWJsZWQsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBleGlzdGluZyBJZGVudGl0eSBWZXJpZmljYXRpb24uIElmIGlkZW1wb3RlbmN5IGlzIGRpc2FibGVkLCBQbGFpZCB3aWxsIHJlamVjdCB0aGUgcmVxdWVzdCB3aXRoIGEgYDQwMCBCYWQgUmVxdWVzdGAgc3RhdHVzIGNvZGUgaWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc3VwcGxpZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfaWRlbXBvdGVudD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VyIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBvdXRzaWRlIG9mIExpbmssIG1vc3QgbGlrZWx5IHZpYSB5b3VyIG93biBvbmJvYXJkaW5nIHByb2Nlc3MuICBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpdHkgZmllbGRzIGFyZSBvcHRpb25hbDogIGBlbWFpbF9hZGRyZXNzYCAgYHBob25lX251bWJlcmAgIGBkYXRlX29mX2JpcnRoYCAgYG5hbWVgICBgYWRkcmVzc2AgIGBpZF9udW1iZXJgICBTcGVjaWZpY2FsbHksIHRoZXNlIGZpZWxkcyBhcmUgb3B0aW9uYWwgaW4gdGhhdCB0aGV5IGNhbiBlaXRoZXIgYmUgZnVsbHkgcHJvdmlkZWQgKHNhdGlzZnlpbmcgZXZlcnkgcmVxdWlyZWQgZmllbGQgaW4gdGhlaXIgc3Vic2NoZW1hKSBvciBvbWl0dGVkIGZyb20gdGhlIHJlcXVlc3QgZW50aXJlbHkgYnkgbm90IHByb3ZpZGluZyB0aGUga2V5IG9yIHZhbHVlLiBQcm92aWRpbmcgdGhlc2UgZmllbGRzIHZpYSB0aGUgQVBJIHdpbGwgcmVzdWx0IGluIExpbmsgc2tpcHBpbmcgdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBBbGwgdmVyaWZpY2F0aW9uIHN0ZXBzIGVuYWJsZWQgaW4gdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFRlbXBsYXRlIHdpbGwgc3RpbGwgYmUgcnVuLiBWZXJpZmljYXRpb24gc3RlcHMgd2lsbCBlaXRoZXIgYmUgcnVuIGltbWVkaWF0ZWx5LCBvciBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgYGFjY2VwdF90b3NgIHN0ZXAsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgcHJvdmlkZWQgdG8gdGhlIGBnYXZlX2NvbnNlbnRgIGZpZWxkLiBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgc2hhcmVhYmxlIFVSTCBmZWF0dXJlLCB5b3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGVzZSBmaWVsZHMgdmlhIGAvbGluay90b2tlbi9jcmVhdGVgIGluc3RlYWQ7IGJvdGggYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYCBhbmQgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYXJlIHZhbGlkIHdheXMgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgYSBub24tYG51bGxgIHVzZXIgZGF0YSBvYmplY3QgdmlhIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAsIGFueSB1c2VyIGRhdGEgZmllbGRzIGVudGVyZWQgdmlhIGAvbGluay90b2tlbi9jcmVhdGVgIGZvciB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgIHdpbGwgYmUgaWdub3JlZCB3aGVuIHByZWZpbGxpbmcgTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBjbGllbnRfdXNlcl9pZGAgYXQgdGhlIHJvb3QgbGV2ZWwgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gVGhlIGFkZHJlc3MgbXVzdCBhdCBsZWFzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgZmllbGRzIHRvIGJlIGEgdmFsaWQgYWRkcmVzczogYHN0cmVldGAsIGBjaXR5YCwgYGNvdW50cnlgLiBJZiBhbnkgYXJlIG1pc3Npbmcgb3IgdW5hYmxlIHRvIGJlIGV4dHJhY3RlZCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBudWxsLiAgYHJlZ2lvbmAsIGFuZCBgcG9zdGFsX2NvZGVgIG1heSBiZSBudWxsIGJhc2VkIG9uIHRoZSBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGUgIE5vdGU6IE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uIChPQ1IpIHRlY2hub2xvZ3kgbWF5IHNvbWV0aW1lcyBleHRyYWN0IGluY29ycmVjdCBkYXRhIGZyb20gYSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2l0eSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBQbGFpZCBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBzZXNzaW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJZGVudGl0eVZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczogQXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBwcm92aWRlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhlaXIgbmFtZSwgdGhpcyBmaWVsZCB3aWxsIGJlIG51bGwuIE90aGVyd2lzZSwgYm90aCBmaWVsZHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gcmV0cmllZCwgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCB2aWEgdGhlIGRhc2hib2FyZCBvciB0aGUgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFVFJJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHJldHJ5aW5nIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RyYXRlZ3l9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc3RyYXRlZ3k6IFN0cmF0ZWd5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGVwcz86IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0cnVjdGlvbnMgZm9yIHRoZSBgY3VzdG9tYCByZXRyeSBzdHJhdGVneSBzcGVjaWZ5aW5nIHdoaWNoIHN0ZXBzIHNob3VsZCBiZSByZXF1aXJlZCBvciBza2lwcGVkLiAgIE5vdGU6ICAgVGhpcyBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gdGhlIHJldHJ5IHN0cmF0ZWd5IGlzIGBjdXN0b21gIGFuZCBtdXN0IGJlIG9taXR0ZWQgb3RoZXJ3aXNlLiAgQ3VzdG9tIHJldHJpZXMgb3ZlcnJpZGUgc2V0dGluZ3MgaW4geW91ciBQbGFpZCBUZW1wbGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgUGxhaWQgVGVtcGxhdGUgaGFzIGB2ZXJpZnlfc21zYCBkaXNhYmxlZCwgYSBjdXN0b20gcmV0cnkgd2l0aCBgdmVyaWZ5X3Ntc2AgZW5hYmxlZCB3aWxsIHN0aWxsIHJlcXVpcmUgdGhlIHN0ZXAuICBUaGUgYHNlbGZpZV9jaGVja2Agc3RlcCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2FuZGJveCBzZXJ2ZXIuIFNhbmRib3ggcmVxdWVzdHMgd2lsbCBzaWxlbnRseSBkaXNhYmxlIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIHdoZW4gcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGB2ZXJpZnlfc21zYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBga3ljX2NoZWNrYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuICAgYGFjdGl2ZWAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaXMgaW5jb21wbGV0ZS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgb3IgcGFzc2VkLiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQsIHBhc3NpbmcgYWxsIHN0ZXBzIGRlZmluZWQgdG8gdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlICBgZmFpbGVkYCAtIFRoZSB1c2VyIGZhaWxlZCBvbmUgb3IgbW9yZSBzdGVwcyBpbiB0aGUgc2Vzc2lvbiBhbmQgd2FzIHRvbGQgdG8gY29udGFjdCBzdXBwb3J0LiAgYGV4cGlyZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBhY3RpdmUgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSB3aXRob3V0IGJlaW5nIGNvbXBsZXRlZCBhbmQgd2FzIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIGV4cGlyZWQuIE5vdGUgdGhhdCBzZXNzaW9ucyBjdXJyZW50bHkgZG8gbm90IGV4cGlyZS4gQXV0b21hdGljIGV4cGlyYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgZW5hYmxlZCBpbiB0aGUgZnV0dXJlLiAgYGNhbmNlbGVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgY2FuY2VsZWQsIGVpdGhlciB2aWEgdGhlIGRhc2hib2FyZCBieSBhIHVzZXIsIG9yIHZpYSBBUEkuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBDYW5jZWxlZCA9ICdjYW5jZWxlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3Jldmlldydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN0ZXAgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFdhaXRpbmdGb3JQcmVyZXF1aXNpdGUgPSAnd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlJyxcbiAgICBOb3RBcHBsaWNhYmxlID0gJ25vdF9hcHBsaWNhYmxlJyxcbiAgICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnLFxuICAgIE1hbnVhbGx5UmVqZWN0ZWQgPSAnbWFudWFsbHlfcmVqZWN0ZWQnXG59XG5cbi8qKlxuICogRWFjaCBzdGVwIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgIGBhY3RpdmVgIC0gVGhpcyBzdGVwIGlzIHRoZSB1c2VyXFwncyBjdXJyZW50IHN0ZXAuIFRoZXkgYXJlIGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBjb21wbGV0aW5nIHRoaXMgc3RlcCwgb3IgdGhleSByZWNlbnRseSBjbG9zZWQgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHN0ZXAuIE9ubHkgb25lIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYGFjdGl2ZWAgYXQgYW55IGdpdmVuIHBvaW50LiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgdGhpcyBzdGVwLiBUaGlzIGNhbiBlaXRoZXIgY2FsbCB0aGUgdXNlciB0byBmYWlsIHRoZSBzZXNzaW9uIGFzIGEgd2hvbGUsIG9yIGNhdXNlIHRoZW0gdG8gZmFsbGJhY2sgdG8gYW5vdGhlciBzdGVwIGRlcGVuZGluZyBvbiBob3cgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSBpcyBjb25maWd1cmVkLiBBIGZhaWxlZCBzdGVwIGRvZXMgbm90IGltcGx5IGEgZmFpbGVkIHNlc3Npb24uICBgd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlYCAtIFRoZSB1c2VyIG5lZWRzIHRvIGNvbXBsZXRlIGFub3RoZXIgc3RlcCBmaXJzdCwgYmVmb3JlIHRoZXkgcHJvZ3Jlc3MgdG8gdGhpcyBzdGVwLiBUaGlzIHN0ZXAgbWF5IG5ldmVyIHJ1biwgZGVwZW5kaW5nIG9uIGlmIHRoZSB1c2VyIGZhaWxzIGFuIGVhcmxpZXIgc3RlcCBvciBpZiB0aGUgc3RlcCBpcyBvbmx5IHJ1biBhcyBhIGZhbGxiYWNrLiAgYG5vdF9hcHBsaWNhYmxlYCAtIFRoaXMgc3RlcCB3aWxsIG5vdCBiZSBydW4gZm9yIHRoaXMgc2Vzc2lvbi4gIGBza2lwcGVkYCAtIFRoZSByZXRyeSBpbnN0cnVjdGlvbnMgdGhhdCBjcmVhdGVkIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgc3BlY2lmaWVkIHRoYXQgdGhpcyBzdGVwIHNob3VsZCBiZSBza2lwcGVkLiAgYGV4cGlyZWRgIC0gVGhpcyBzdGVwIGhhZCBub3QgeWV0IGJlZW4gY29tcGxldGVkIHdoZW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGFzIGEgd2hvbGUgZXhwaXJlZC4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkIGJlZm9yZSB0aGUgdXNlciBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYHBlbmRpbmdfcmV2aWV3YCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB0ZW1wbGF0ZSB3YXMgY29uZmlndXJlZCB0byBwZXJmb3JtIGEgc2NyZWVuaW5nIHRoYXQgaGFkIG9uZSBvciBtb3JlIGhpdHMgbmVlZGluZyByZXZpZXcuICBgbWFudWFsbHlfYXBwcm92ZWRgIC0gVGhlIHN0ZXAgd2FzIG1hbnVhbGx5IG92ZXJyaWRkZW4gdG8gcGFzcyBieSBhIHRlYW0gbWVtYmVyIGluIHRoZSBkYXNoYm9hcmQuICBgbWFudWFsbHlfcmVqZWN0ZWRgIC0gVGhlIHN0ZXAgd2FzIG1hbnVhbGx5IG92ZXJyaWRkZW4gdG8gZmFpbCBieSBhIHRlYW0gbWVtYmVyIGluIHRoZSBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgYWNjZXB0X3RvczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmc6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyBjb21wbGV0ZWQgYSBzdGVwIG9mIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEVQX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSByZXNvdXJjZSBJRCBhbmQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyaW5nIHRoZSBiZWhhdmlvciBvZiBhIGdpdmVuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gY29sbGVjdGVkLCBzb21lIGZpZWxkcyBtYXkgYmUgbnVsbCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvblxcJ3MgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSB0aGF0IHdhcyBlaXRoZXIgY29sbGVjdGVkIGZyb20gdGhlIHVzZXIgb3IgcHJvdmlkZWQgdmlhIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBoaWdoIGxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGUgdXNlciBzdWJtaXR0ZWQuICBGb3IgZXhhbXBsZSwgYW4gaW1hZ2UgdGhhdCBpcyBibHVycnksIGRpc3RvcnRlZCBieSBnbGFyZSBmcm9tIGEgbmVhcmJ5IGxpZ2h0IHNvdXJjZSwgb3IgaW1wcm9wZXJseSBmcmFtZWQgbWlnaHQgYmUgbWFya2VkIGFzIGxvdyBvciBtZWRpdW0gcXVhbGl0eS4gUG9vciBxdWFsaXR5IGltYWdlcyBhcmUgbW9yZSBsaWtlbHkgdG8gZmFpbCBPQ1IgYW5kL29yIHRlbXBsYXRlIGNvbmZvcm1pdHkgY2hlY2tzLiAgTm90ZTogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBsZXQgYSB1c2VyIHJlY2FwdHVyZSBkb2N1bWVudCBpbWFnZXMgdHdpY2UgYmVmb3JlIGZhaWxpbmcgdGhlIGVudGlyZSBzZXNzaW9uIGlmIHdlIGF0dHJpYnV0ZSB0aGUgZmFpbHVyZSB0byBsb3cgaW1hZ2UgcXVhbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eSB7XG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBMb3cgPSAnbG93J1xufVxuXG4vKipcbiAqIEFuIHVwZGF0ZSBvbiB0aGUgaGVhbHRoIGluY2lkZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEluY2lkZW50VXBkYXRlU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSB1cGRhdGUgd2FzIHB1Ymxpc2hlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW0ge1xuICAgIEludmVzdGlnYXRpbmcgPSAnSU5WRVNUSUdBVElORycsXG4gICAgSWRlbnRpZmllZCA9ICdJREVOVElGSUVEJyxcbiAgICBTY2hlZHVsZWQgPSAnU0NIRURVTEVEJyxcbiAgICBSZXNvbHZlZCA9ICdSRVNPTFZFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBicmVha2Rvd24gb2YgdGhlIGRpZmZlcmVudCBpbmNvbWUgdHlwZXMgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZUJyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZUJyZWFrZG93blR5cGV9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU6IEluY29tZUJyZWFrZG93blR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBob3VybHkgcmF0ZSBhdCB3aGljaCB0aGUgaW5jb21lIGlzIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGhvdXJzIGxvZ2dlZCBmb3IgdGhpcyBpbmNvbWUgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcGF5IGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGluY29tZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICAgYFxcXCJyZWd1bGFyXFxcImA6IHJlZ3VsYXIgaW5jb21lICAgYFxcXCJvdmVydGltZVxcXCJgOiBvdmVydGltZSBpbmNvbWUgICBgXFxcImJvbnVzXFxcImA6IGJvbnVzIGluY29tZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lQnJlYWtkb3duVHlwZSB7XG4gICAgQm9udXMgPSAnYm9udXMnLFxuICAgIE92ZXJ0aW1lID0gJ292ZXJ0aW1lJyxcbiAgICBSZWd1bGFyID0gJ3JlZ3VsYXInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IHBheXJvbGwgZGF0YSBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGF5c3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVPdmVycmlkZVxuICAgICAqL1xuICAgIHBheXN0dWJzPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlPjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBlbmRwb2ludCB0byB3aGljaCBQbGFpZCBzaG91bGQgc2VuZCB3ZWJob29rcyByZWxhdGVkIHRvIHRoZSBwcm9ncmVzcyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcHJlY2hlY2sgY3JlYXRlZCB3aXRoIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuIFdpbGwgYmUgdXNlZCB0byBpbXByb3ZlIGNvbnZlcnNpb24gb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJlY2hlY2tfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBJdGVtcyB0aGF0IHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZSBwcm9kdWN0IGRhdGEuIFBsYWlkIHdpbGwgYXR0ZW1wdCB0byBjb3JyZWxhdGUgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIHRoZXNlIEl0ZW1zIHdpdGggZGF0YSBmcm9tIHRoZSB1c2VyXFwncyBwYXlzdHViLCBzdWNoIGFzIGRhdGUgYW5kIGFtb3VudC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBMaW5rLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIHRoaXMgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHlzaXMgb3B0aW9ucyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHBhcnNpbmdcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWcge1xuICAgIE9jciA9ICdvY3InLFxuICAgIEZyYXVkUmlzayA9ICdmcmF1ZF9yaXNrJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvY3VtZW50IElEIHRvIGRvd25sb2FkLiBJZiBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdGluZyB6aXAgZmlsZSwgcmF0aGVyIHRoYW4gYWxsIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGbG93IHR5cGVzIHRvIHJldHJpZXZlIHBheXJvbGwgaW5jb21lIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxGbG93VHlwZSB7XG4gICAgRGlnaXRhbEluY29tZSA9ICdwYXlyb2xsX2RpZ2l0YWxfaW5jb21lJyxcbiAgICBEb2N1bWVudEluY29tZSA9ICdwYXlyb2xsX2RvY3VtZW50X2luY29tZSdcbn1cblxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbiBmb3Igd2hpY2ggdG8gZ2V0IHBheXN0dWIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgZm9yIGFuIGluY29tZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YT86IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWJzOiBBcnJheTxQYXlzdHViPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb25maWRlbmNlIHRoYXQgUGxhaWQgY2FuIHN1cHBvcnQgdGhlIHVzZXIgaW4gdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93IGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgbWFudWFsIHBheXN0dWIgdXBsb2FkLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiSElHSFxcXCJgOiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gIFxcXCJgTE9XYFxcXCI6IEl0IGlzIHVubGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgYFxcXCJVTktOT1dOXFxcImA6IEl0IHdhcyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1c2VyIGlzIHN1cHBvcnRhYmxlIHdpdGggdGhlIGluZm9ybWF0aW9uIHBhc3NlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBMb3cgPSAnTE9XJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCBtaWxpdGFyeSBpbmZvIGluIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByZWNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8ge1xuICAgIC8qKlxuICAgICAqIElzIHRoZSB1c2VyIGN1cnJlbnRseSBhY3RpdmUgZHV0eSBpbiB0aGUgVVMgbWlsaXRhcnlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBpc19hY3RpdmVfZHV0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZXJ2aW5nIGluIHRoZSBVUyBtaWxpdGFyeSwgdGhlIGJyYW5jaCBvZiB0aGUgbWlsaXRhcnkgaW4gd2hpY2ggdGhleSBhcmUgc2VydmluZyBWYWxpZCB2YWx1ZXM6IFxcJ0FJUiBGT1JDRVxcJywgXFwnQVJNWVxcJywgXFwnQ09BU1QgR1VBUkRcXCcsIFxcJ01BUklORVNcXCcsIFxcJ05BVllcXCcsIFxcJ1VOS05PV05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGJyYW5jaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlclxcJ3MgcGF5cm9sbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gSXRlbXMgYmVsb25naW5nIHRvIHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGNoZWNrZWQuIE5vdGUgdGhhdCBpZiB0aGUgSXRlbXMgc3BlY2lmaWVkIGhlcmUgYXJlIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIHByb3ZpZGluZyB0aGVtIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSB0aGVzZSBJdGVtcyB0byBiZSBpbml0aWFsaXplZCB3aXRoIChhbmQgYmlsbGVkIGZvcikgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwcmVjaGVjay4gUHJvdmlkZSB0aGlzIHZhbHVlIHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbiBvcmRlciB0byBvcHRpbWl6ZSBMaW5rIGNvbnZlcnNpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2U6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgZXZhbHVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgaG9tZV9hZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBhdHRlbXB0IHRvIHJlZnJlc2ggUGF5cm9sbCBJbmNvbWUgZGF0YSBmb3IgYSB1c2VyIHZpYSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCBmYWlsZWQgYmVjYXVzZSB0aGUgdXNlciBtdXN0IHJlLWNvbm5lY3QgdGhlaXIgcGF5cm9sbCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUkVGUkVTSF9SRUNPTk5FQ1RfTkVFREVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJpc2sgc2lnbmFscyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBkb2N1bWVudHMgdXBsb2FkZWQgdmlhIERvY3VtZW50IEluY29tZS4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBhIG1pbnV0ZSBvciB0d28gZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBtYXkgdGhlbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYW5kIHRvIHJldHJpZXZlIHJpc2sgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJJU0tfU0lHTkFMU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gZnJhdWQgZGV0ZWN0aW9uIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHVzZXIgdXBsb2FkZWQgbXVsdGlwbGUgZG9jdW1lbnRzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYWxsIGRvY3VtZW50cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIENhbGwgdGhlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGVuZHBvaW50IHRvIGdldCBhbGwgcmlzayBzaWduYWwgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHNfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzaGFyZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2UgaGFzIGNoYW5nZWQuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZvcm1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUYXhmb3JtPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRheGZvcm1zOiBBcnJheTxUYXhmb3JtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGFyZW50IGNvbnRhaW5lciBmb3IgbmFtZSB0aGF0IGFsbG93cyBmb3IgY2hvaWNlIGdyb3VwIGJldHdlZW4gcGFyc2VkIGFuZCB1bnBhcnNlZCBjb250YWluZXJzLlBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBGaXJzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogTmFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCwgaW5jbHVkaW5nIGFsbCBwYXJ0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBuYW1lcyBhcmUgdGhvc2UgbW9zdCBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgcGVyc29uLiBPbmx5IG9uZSBuYW1lIHdpbGwgZXZlciBiZSBtYXJrZWQgYXMgcHJpbWFyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2Vha0FsaWFzRGV0ZXJtaW5hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBTaG9ydGhhbmQgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyBzY3JlZW5pbmcgbGlzdCBmb3IgaW5kaXZpZHVhbHMuICBgQVVfQ09OYDogQXVzdHJhbGlhIERlcGFydG1lbnQgb2YgRm9yZWlnbiBBZmZhaXJzIGFuZCBUcmFkZSBDb25zb2xpZGF0ZWQgTGlzdCAgYENBX0NPTmA6IEdvdmVybm1lbnQgb2YgQ2FuYWRhIENvbnNvbGlkYXRlZCBMaXN0IG9mIFNhbmN0aW9ucyAgYEVVX0NPTmA6IEV1cm9wZWFuIEV4dGVybmFsIEFjdGlvbiBTZXJ2aWNlIENvbnNvbGlkYXRlZCBMaXN0ICBgSVpfQ0lBYDogQ0lBIExpc3Qgb2YgQ2hpZWZzIG9mIFN0YXRlIGFuZCBDYWJpbmV0IE1lbWJlcnMgIGBJWl9JUExgOiBJbnRlcnBvbCBSZWQgTm90aWNlcyBmb3IgV2FudGVkIFBlcnNvbnMgTGlzdCAgYElaX1BFUGA6IFBvbGl0aWNhbGx5IEV4cG9zZWQgUGVyc29ucyBMaXN0ICBgSVpfVU5DYDogVW5pdGVkIE5hdGlvbnMgQ29uc29saWRhdGVkIFNhbmN0aW9ucyAgYElaX1dCS2A6IFdvcmxkIEJhbmsgTGlzdGluZyBvZiBJbmVsaWdpYmxlIEZpcm1zIGFuZCBJbmRpdmlkdWFscyAgYFVLX0hNQ2A6IFVLIEhNIFRyZWFzdXJ5IENvbnNvbGlkYXRlZCBMaXN0ICBgVVNfRFBMYDogQnVyZWF1IG9mIEluZHVzdHJ5IGFuZCBTZWN1cml0eSBEZW5pZWQgUGVyc29ucyBMaXN0ICBgVVNfRFRDYDogVVMgRGVwYXJ0bWVudCBvZiBTdGF0ZSBBRUNBIERlYmFycmVkICBgVVNfRkJJYDogVVMgRGVwYXJ0bWVudCBvZiBKdXN0aWNlIEZCSSBXYW50ZWQgTGlzdCAgYFVTX0ZTRWA6IFVTIE9GQUMgRm9yZWlnbiBTYW5jdGlvbnMgRXZhZGVycyAgYFVTX0lTTmA6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgTm9ucHJvbGlmZXJhdGlvbiBTYW5jdGlvbnMgIGBVU19QTENgOiBVUyBPRkFDIFBhbGVzdGluaWFuIExlZ2lzbGF0aXZlIENvdW5jaWwgIGBVU19TRE5gOiBVUyBPRkFDIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgU0dfU09GYDogR292ZXJubWVudCBvZiBTaW5nYXBvcmUgVGVycm9yaXN0cyBhbmQgVGVycm9yaXN0IEVudGl0aWVzICBgVFJfVFdMYDogR292ZXJubWVudCBvZiBUdXJrZXkgVGVycm9yaXN0IFdhbnRlZCBMaXN0ICBgVFJfREZEYDogR292ZXJubWVudCBvZiBUdXJrZXkgRG9tZXN0aWMgRnJlZXppbmcgRGVjaXNpb25zICBgVFJfRk9SYDogR292ZXJubWVudCBvZiBUdXJrZXkgRm9yZWlnbiBGcmVlemluZyBSZXF1ZXN0cyAgYFRSX1dNRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFdlYXBvbnMgb2YgTWFzcyBEZXN0cnVjdGlvbiAgYFRSX0NNQmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IENhcGl0YWwgTWFya2V0cyBCb2FyZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5kaXZpZHVhbFdhdGNobGlzdENvZGUge1xuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgQ2FDb24gPSAnQ0FfQ09OJyxcbiAgICBFdUNvbiA9ICdFVV9DT04nLFxuICAgIEl6Q2lhID0gJ0laX0NJQScsXG4gICAgSXpJcGwgPSAnSVpfSVBMJyxcbiAgICBJelBlcCA9ICdJWl9QRVAnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVa0htYyA9ICdVS19ITUMnLFxuICAgIFVzRHBsID0gJ1VTX0RQTCcsXG4gICAgVXNEdGMgPSAnVVNfRFRDJyxcbiAgICBVc0ZiaSA9ICdVU19GQkknLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNJc24gPSAnVVNfSVNOJyxcbiAgICBVc01icyA9ICdVU19NQlMnLFxuICAgIFVzUGxjID0gJ1VTX1BMQycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFNnU29mID0gJ1NHX1NPRicsXG4gICAgVHJUd2wgPSAnVFJfVFdMJyxcbiAgICBUckRmZCA9ICdUUl9ERkQnLFxuICAgIFRyRm9yID0gJ1RSX0ZPUicsXG4gICAgVHJXbWQgPSAnVFJfV01EJyxcbiAgICBUckNtYiA9ICdUUl9DTUInXG59XG5cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBpbmRpdmlkdWFscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIEluZGl2aWR1YWxzXFxcIiwgXFxcIlVTIENhcmRob2xkZXJzXFxcIiwgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBgaW5mbG93X21vZGVsYCBhbGxvd3MgeW91IHRvIG1vZGVsIGEgdGVzdCBhY2NvdW50IHRoYXQgcmVjZWl2ZXMgcmVndWxhciBpbmNvbWUgb3IgbWFrZSByZWd1bGFyIHBheW1lbnRzIG9uIGEgbG9hbi4gQW55IHRyYW5zYWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIGBpbmZsb3dfbW9kZWxgIHdpbGwgYXBwZWFyIGluIGFkZGl0aW9uIHRvIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0IGRhdGEgb3IgdHJhbnNhY3Rpb25zIHNwZWNpZmllZCBieSBgb3ZlcnJpZGVfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmZsb3dNb2RlbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5mbG93TW9kZWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmZsb3cgbW9kZWwuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYG5vbmVgOiBObyBpbmNvbWUgIGBtb250aGx5LWluY29tZWA6IEluY29tZSBvY2N1cnMgb25jZSBwZXIgbW9udGggYG1vbnRobHktYmFsYW5jZS1wYXltZW50YDogUGF5cyBvZmYgdGhlIGJhbGFuY2Ugb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGA6IE1ha2VzIGFuIGludGVyZXN0LW9ubHkgcGF5bWVudCBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoLiAgTm90ZSB0aGF0IGFjY291bnQgdHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzIHdpbGwgYWNjcnVlIGludGVyZXN0IGluIHRoZSBTYW5kYm94LiBUaGUgdHlwZXMgaW1wYWN0ZWQgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIHN1YnR5cGUgYGNyZWRpdGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgaW5jb21lIHBlciBtb250aC4gVGhpcyB2YWx1ZSBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIGluY29tZV9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGluY29tZSB0cmFuc2FjdGlvbiB3aWxsIGFwcGVhci4gVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgcGF5bWVudF9kYXlfb2ZfbW9udGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBiYWxhbmNlIGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9kYXlfb2ZfbW9udGg6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBpbml0aWFsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBJZiBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkgaXMgZW5hYmxlZCwgdGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGV0YWlscyByZWxhdGluZyB0byBhIHNwZWNpZmljIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGluc3RpdHV0aW9uLiBOb3RlIHRoYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gbWF5IGhhdmUgbXVsdGlwbGUgcmVjb3JkcywgZWFjaCB3aXRoIGRpZmZlcmVudCBpbnN0aXR1dGlvbiBJRHM7IGZvciBleGFtcGxlLCBpZiB0aGUgaW5zdGl0dXRpb24gaGFzIG1pZ3JhdGVkIHRvIE9BdXRoLCB0aGVyZSBtYXkgYmUgc2VwYXJhdGUgYGluc3RpdHV0aW9uX2lkYHMgZm9yIHRoZSBPQXV0aCBhbmQgbm9uLU9BdXRoIHZlcnNpb25zIG9mIHRoZSBpbnN0aXR1dGlvbi4gSW5zdGl0dXRpb25zIHRoYXQgb3BlcmF0ZSBpbiBkaWZmZXJlbnQgY291bnRyaWVzIG9yIHdpdGggbXVsdGlwbGUgbG9naW4gcG9ydGFscyBtYXkgYWxzbyBoYXZlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciBlYWNoIGNvdW50cnkgb3IgcG9ydGFsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBQbGFpZCBwcm9kdWN0cyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBOb3RlIHRoYXQgb25seSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IEluc3RhbnQgQXV0aCB3aWxsIHJldHVybiBgYXV0aGAgaW4gdGhlIHByb2R1Y3QgYXJyYXk7IGluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBsaXN0IGBhdXRoYCBtYXkgc3RpbGwgc3VwcG9ydCBvdGhlciBBdXRoIG1ldGhvZHMgc3VjaCBhcyBJbnN0YW50IE1hdGNoIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IFZlcmlmaWNhdGlvbi4gVG8gaWRlbnRpZnkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCB0aG9zZSBtZXRob2RzLCB1c2UgdGhlIGBhdXRoX21ldGFkYXRhYCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbRnVsbCBBdXRoIGNvdmVyYWdlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBhcnRpYWwgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi4gVGhpcyBsaXN0IGlzIHByb3ZpZGVkIGZvciB0aGUgcHVycG9zZSBvZiBsb29raW5nIHVwIGluc3RpdHV0aW9ucyBieSByb3V0aW5nIG51bWJlci4gSXQgaXMgbm90IGNvbXByZWhlbnNpdmUgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIGEgY29tcGxldGUgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgZm9yIGFuIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIHBhcnRpYWwgbGlzdCBvZiBEVEMgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGR0Y19udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdGl0dXRpb24gaGFzIGFuIE9BdXRoIGxvZ2luIGZsb3cuIFRoaXMgd2lsbCBiZSBgdHJ1ZWAgaWYgT0F1dGggaXMgc3VwcG9ydGVkIGZvciBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgZXZlbiBpZiB0aGUgaW5zdGl0dXRpb24gYWxzbyBzdXBwb3J0cyBub24tT0F1dGggY29ubmVjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgb2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEluc3RpdHV0aW9uU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGF1dGhfbWV0YWRhdGE/OiBBdXRoTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGFuIGluc3RpdHV0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGhlYWx0aCBvZiBpdHMgSXRlbSBsb2dpbnMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBBdXRoIHJlcXVlc3RzLCBCYWxhbmNlIHJlcXVlc3RzLCBJZGVudGl0eSByZXF1ZXN0cywgSW52ZXN0bWVudHMgcmVxdWVzdHMsIGFuZCBMaWFiaWxpdGllcyByZXF1ZXN0cy4gQSBsb2dpbiBhdHRlbXB0IGlzIGNvbmR1Y3RlZCBkdXJpbmcgdGhlIGluaXRpYWwgSXRlbSBhZGQgaW4gTGluay4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCB0cmFmZmljIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGFuIGluc3RpdHV0aW9uXFwncyBzdGF0dXMsIFBsYWlkIHdpbGwgcmV0dXJuIG51bGwgcmF0aGVyIHRoYW4gcG90ZW50aWFsbHkgaW5hY2N1cmF0ZSBkYXRhLiAgSW5zdGl0dXRpb24gc3RhdHVzIGlzIGFjY2Vzc2libGUgaW4gdGhlIERhc2hib2FyZCBhbmQgdmlhIHRoZSBBUEkgdXNpbmcgdGhlIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAgZW5kcG9pbnQgd2l0aCB0aGUgYGluY2x1ZGVfc3RhdHVzYCBvcHRpb24gc2V0IHRvIHRydWUuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbiBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGl0ZW1fbG9naW5zPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBhdXRoPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHJlY2VudCBoZWFsdGggaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEhlYWx0aEluY2lkZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBoZWFsdGhfaW5jaWRlbnRzPzogQXJyYXk8SGVhbHRoSW5jaWRlbnQ+IHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpbnN0aXR1dGlvbiBzdGF0dXMgbWVldHMgdGhlIGNvbmRpdGlvbnMgY29uZmlndXJlZCBpbiB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYERBU0hCT0FSRF9DT05GSUdVUkVEX0FMRVJUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOU1RJVFVUSU9OX1NUQVRVU19BTEVSVF9UUklHR0VSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwgc3VjY2VzcyByYXRlIG9mIHRoZSBpbnN0aXR1dGlvbiwgY2FsY3VsYXRlZCBiYXNlZCBvbiBpdGVtIGFkZCBoZWFsdGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9vdmVyYWxsX3N1Y2Nlc3NfcmF0ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIFJUUCBuZXR3b3JrIGFuZCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUH1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICAgICAqL1xuICAgIHJ0cDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFA7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0byBnZXQgZGV0YWlscyBhYm91dFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gc2tpcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoaWNoIHByb2R1Y3RzIHRoZXkgc3VwcG9ydC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LiBSb3V0aW5nIG51bWJlciByZWNvcmRzIHVzZWQgZm9yIHRoaXMgbWF0Y2hpbmcgYXJlIG5vdCBjb21wcmVoZW5zaXZlOyBmYWlsdXJlIHRvIG1hdGNoIGEgZ2l2ZW4gcm91dGluZyBudW1iZXIgdG8gYW4gaW5zdGl0dXRpb24gZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBpbnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJLCBhbmQgdGhhdCBieSBhY2Nlc3Npbmcgb3IgdXNpbmcgdGhlc2UgbG9nb3MsIHlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgZG9pbmcgc28gYXQgeW91ciBvd24gcmlzayBhbmQgd2lsbCwgaWYgbmVjZXNzYXJ5LCBvYnRhaW4gYWxsIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJpZ2h0cyBob2xkZXJzIGFuZCBhZGhlcmUgdG8gYW55IGFwcGxpY2FibGUgdXNhZ2UgZ3VpZGVsaW5lcy4gUGxhaWQgZGlzY2xhaW1zIGFsbCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ29zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFBsYWlkIGluc3RpdHV0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gYWNjb3VudCBmaWx0ZXIgdG8gYXBwbHkgdG8gaW5zdGl0dXRpb25zIHNlYXJjaCByZXF1ZXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMgYnkgdmFyaW91cyBQYXltZW50IEluaXRpYXRpb24gY29uZmlndXJhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeS4gSW5zdGl0dXRpb25zIHdpdGggbmFtZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGFyZSByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBzdXBwb3J0IGFsbCBwcm9kdWN0cyBsaXN0ZWQgaW4gYHByb2R1Y3RzYC4gUHJvdmlkZSBgbnVsbGAgdG8gZ2V0IGluc3RpdHV0aW9ucyByZWdhcmRsZXNzIG9mIHN1cHBvcnRlZCBwcm9kdWN0cy4gTm90ZSB0aGF0IHdoZW4gYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGlmIHlvdSBhcmUgZW5hYmxlZCBmb3IgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgcHJvZHVjdHMgd2lsbCBiZSByZXR1cm5lZCBldmVuIGlmIGBhdXRoYCBpcyBub3QgcHJlc2VudCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbj86IEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbnN0aXR1dGlvbnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtaW52ZXN0bWVudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFN1YnR5cGUge1xuICAgIF81MjkgPSAnNTI5JyxcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBMaWYgPSAnbGlmJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ2xpZmUgaW5zdXJhbmNlJyxcbiAgICBMaXJhID0gJ2xpcmEnLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJBbm51aXR5ID0gJ290aGVyIGFubnVpdHknLFxuICAgIE90aGVySW5zdXJhbmNlID0gJ290aGVyIGluc3VyYW5jZScsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFByb2ZpdFNoYXJpbmdQbGFuID0gJ3Byb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFFzaHIgPSAncXNocicsXG4gICAgUmRzcCA9ICdyZHNwJyxcbiAgICBSZXNwID0gJ3Jlc3AnLFxuICAgIFJldGlyZW1lbnQgPSAncmV0aXJlbWVudCcsXG4gICAgUmxpZiA9ICdybGlmJyxcbiAgICBSb3RoID0gJ3JvdGgnLFxuICAgIFJvdGg0MDFrID0gJ3JvdGggNDAxaycsXG4gICAgUnJpZiA9ICdycmlmJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNhcnNlcCA9ICdzYXJzZXAnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGVnYWN5IGZpZWxkIGZvcm1lcmx5IHVzZWQgaW50ZXJuYWxseSBieSBQbGFpZCB0byBpZGVudGlmeSBjZXJ0YWluIGNhbmNlbGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhbmNlbF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb27igJlzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZSB7XG4gICAgQWNjb3VudEZlZSA9ICdhY2NvdW50IGZlZScsXG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBc3NpZ25tZW50ID0gJ2Fzc2lnbm1lbnQnLFxuICAgIEJ1eSA9ICdidXknLFxuICAgIEJ1eVRvQ292ZXIgPSAnYnV5IHRvIGNvdmVyJyxcbiAgICBDb250cmlidXRpb24gPSAnY29udHJpYnV0aW9uJyxcbiAgICBEZXBvc2l0ID0gJ2RlcG9zaXQnLFxuICAgIERpc3RyaWJ1dGlvbiA9ICdkaXN0cmlidXRpb24nLFxuICAgIERpdmlkZW5kID0gJ2RpdmlkZW5kJyxcbiAgICBEaXZpZGVuZFJlaW52ZXN0bWVudCA9ICdkaXZpZGVuZCByZWludmVzdG1lbnQnLFxuICAgIEV4ZXJjaXNlID0gJ2V4ZXJjaXNlJyxcbiAgICBFeHBpcmUgPSAnZXhwaXJlJyxcbiAgICBGdW5kRmVlID0gJ2Z1bmQgZmVlJyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgSW50ZXJlc3RSZWNlaXZhYmxlID0gJ2ludGVyZXN0IHJlY2VpdmFibGUnLFxuICAgIEludGVyZXN0UmVpbnZlc3RtZW50ID0gJ2ludGVyZXN0IHJlaW52ZXN0bWVudCcsXG4gICAgTGVnYWxGZWUgPSAnbGVnYWwgZmVlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdsb2FuIHBheW1lbnQnLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW4gPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgTWFuYWdlbWVudEZlZSA9ICdtYW5hZ2VtZW50IGZlZScsXG4gICAgTWFyZ2luRXhwZW5zZSA9ICdtYXJnaW4gZXhwZW5zZScsXG4gICAgTWVyZ2VyID0gJ21lcmdlcicsXG4gICAgTWlzY2VsbGFuZW91c0ZlZSA9ICdtaXNjZWxsYW5lb3VzIGZlZScsXG4gICAgTm9uUXVhbGlmaWVkRGl2aWRlbmQgPSAnbm9uLXF1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgTm9uUmVzaWRlbnRUYXggPSAnbm9uLXJlc2lkZW50IHRheCcsXG4gICAgUGVuZGluZ0NyZWRpdCA9ICdwZW5kaW5nIGNyZWRpdCcsXG4gICAgUGVuZGluZ0RlYml0ID0gJ3BlbmRpbmcgZGViaXQnLFxuICAgIFF1YWxpZmllZERpdmlkZW5kID0gJ3F1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgUmViYWxhbmNlID0gJ3JlYmFsYW5jZScsXG4gICAgUmV0dXJuT2ZQcmluY2lwYWwgPSAncmV0dXJuIG9mIHByaW5jaXBhbCcsXG4gICAgUmVxdWVzdCA9ICdyZXF1ZXN0JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIFNlbGxTaG9ydCA9ICdzZWxsIHNob3J0JyxcbiAgICBTZW5kID0gJ3NlbmQnLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIFNwaW5PZmYgPSAnc3BpbiBvZmYnLFxuICAgIFNwbGl0ID0gJ3NwbGl0JyxcbiAgICBTdG9ja0Rpc3RyaWJ1dGlvbiA9ICdzdG9jayBkaXN0cmlidXRpb24nLFxuICAgIFRheCA9ICd0YXgnLFxuICAgIFRheFdpdGhoZWxkID0gJ3RheCB3aXRoaGVsZCcsXG4gICAgVHJhZGUgPSAndHJhZGUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBUcmFuc2ZlckZlZSA9ICd0cmFuc2ZlciBmZWUnLFxuICAgIFRydXN0RmVlID0gJ3RydXN0IGZlZScsXG4gICAgVW5xdWFsaWZpZWRHYWluID0gJ3VucXVhbGlmaWVkIGdhaW4nLFxuICAgIFdpdGhkcmF3YWwgPSAnd2l0aGRyYXdhbCdcbn1cblxuLyoqXG4gKiBWYWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYW5jZWxgOiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgd2hpY2ggbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyICBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIENhbmNlbCA9ICdjYW5jZWwnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgRmVlID0gJ2ZlZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInXG59XG5cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBQ0FUUz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2F0cz86IEFycmF5PE51bWJlcnNBQ0FUUz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBVE9OPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGF0b24/OiBBcnJheTxOdW1iZXJzQVRPTj47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXRyaWV2ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXJzIGZvciB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEludmVzdG1lbnRzQXV0aEdldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIHRoZSBvd25lcnNoaXAgb2YgYW4gaW52ZXN0bWVudHMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGlkZW50aXR5IGluZm9ybWF0aW9uIHBlcnRhaW5zIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIGFmdGVyIGFuIGFzeW5jaHJvbm91cyBleHRyYWN0aW9uIG9uIGFuIGludmVzdG1lbnRzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjYW5jZWxlZF9pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwIHdoZW4gZmV0Y2hpbmcgdHJhbnNhY3Rpb24gaGlzdG9yeVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnZlc3RtZW50cyBwcm9kdWN0IHZpYSB0aGUgYHByb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBQb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi4gTXVzdCBiZSBmb3JtYXR0ZWQgYXMgYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvblxcJ3MgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gTXVzdCBiZSBwb3NpdGl2ZSBpZiB0aGUgdHlwZSBpcyBhIGJ1eSBhbmQgbmVnYXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBzZWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBmZWVzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgYnV5YDogQnV5aW5nIGFuIGludmVzdG1lbnQgYHNlbGxgOiBTZWxsaW5nIGFuIGludmVzdG1lbnQgYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VjdXJpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHNlY3VyaXR5PzogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogQSBiaW5hcnkgbWF0Y2ggaW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgY291bnRyeSB0aGF0IGlzc3VlZCB0aGUgcHJvdmlkZWQgZG9jdW1lbnQgbWF0Y2hlcyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gUGxhaWQuICBOb3RlOiBZb3UgY2FuIGNvbmZpZ3VyZSB3aGV0aGVyIGEgYG5vX21hdGNoYCBvbiBgaXNzdWluZ19jb3VudHJ5YCBmYWlscyB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgYnkgZWRpdGluZyB5b3VyIFBsYWlkIFRlbXBsYXRlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXNzdWluZ0NvdW50cnkge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYmlsbGVkX3Byb2R1Y3RzYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgYXZhaWxhYmxlX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBiZWVuIGJpbGxlZCBmb3IgdGhlIEl0ZW0uIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IHdpbGwgYmUgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGF2YWlsYWJsZV9wcm9kdWN0c2AuIE5vdGUgLSBgYmlsbGVkX3Byb2R1Y3RzYCBpcyBwb3B1bGF0ZWQgaW4gYWxsIGVudmlyb25tZW50cyBidXQgb25seSByZXF1ZXN0cyBpbiBQcm9kdWN0aW9uIGFyZSBiaWxsZWQuIEFsc28gbm90ZSB0aGF0IHByb2R1Y3RzIHRoYXQgYXJlIGJpbGxlZCBvbiBhIHBheS1wZXItY2FsbCBiYXNpcyByYXRoZXIgdGhhbiBhIHBheS1wZXItSXRlbSBiYXNpcywgc3VjaCBhcyBgYmFsYW5jZWAsIHdpbGwgbm90IGFwcGVhciBoZXJlLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgYmlsbGVkX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSBJdGVtLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBiaWxsZWRfcHJvZHVjdHNgIGZpZWxkLiBGb3Igc29tZSBwcm9kdWN0cywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGFuIEl0ZW0gYnV0IG5vdCB5ZXQgYmlsbGVkIChlLmcuIEFzc2V0cywgYmVmb3JlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaGFzIGJlZW4gY2FsbGVkLCBvciBBdXRoIG9yIElkZW50aXR5IHdoZW4gYWRkZWQgYXMgT3B0aW9uYWwgUHJvZHVjdHMgYnV0IGJlZm9yZSB0aGVpciBlbmRwb2ludHMgaGF2ZSBiZWVuIGNhbGxlZCksIGluIHdoaWNoIGNhc2UgdGhlIHByb2R1Y3QgbWF5IGFwcGVhciBpbiBgcHJvZHVjdHNgIGJ1dCBub3QgaW4gYGJpbGxlZF9wcm9kdWN0c2AuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGdvbmUgdGhyb3VnaCBjb25zZW50IGNvbGxlY3Rpb24gZm9yIHRoZSBJdGVtLiBPbmx5IHByZXNlbnQgZm9yIHRob3NlIGVuYWJsZWQgaW4gdGhlIFtEYXRhIFRyYW5zcGFyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpIGJldGEuIElmIHlvdSBhcmUgbm90IGVucm9sbGVkIGluIERhdGEgVHJhbnNwYXJlbmN5LCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBSRkMgMzMzOSB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNvbnNlbnQgcHJvdmlkZWQgYnkgdGhlIGVuZCB1c2VyIHdpbGwgZXhwaXJlLiBVcG9uIGNvbnNlbnQgZXhwaXJhdGlvbiwgdGhlIGl0ZW0gd2lsbCBlbnRlciB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlLiBUbyBjaXJjdW12ZW50IHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3IgYW5kIG1haW50YWluIGNvbnRpbnVvdXMgY29uc2VudCwgdGhlIGVuZCB1c2VyIGNhbiByZWF1dGhlbnRpY2F0ZSB2aWEgTGlua+KAmXMgdXBkYXRlIG1vZGUgaW4gYWR2YW5jZSBvZiB0aGUgY29uc2VudCBleHBpcmF0aW9uIHRpbWUuICBOb3RlIC0gVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucy4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHVwZGF0ZV90eXBlOiBJdGVtVXBkYXRlVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSXRlbVVwZGF0ZVR5cGVFbnVtIHtcbiAgICBCYWNrZ3JvdW5kID0gJ2JhY2tncm91bmQnLFxuICAgIFVzZXJQcmVzZW50UmVxdWlyZWQgPSAndXNlcl9wcmVzZW50X3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWN0aXZpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzOiBBcnJheTxBY3Rpdml0eT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRpbWVzdGFtcHMgZm9yIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhIHR5cGUgd2FzIGFjY2Vzc2VkIHBlciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGFzdERhdGFBY2Nlc3NUaW1lcz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3RfZGF0YV9hY2Nlc3NfdGltZXM6IEFycmF5PExhc3REYXRhQWNjZXNzVGltZXM+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+O1xufVxuLyoqXG4gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIGZvciBjbGllbnRzIG1ha2luZyBhIHJlcXVlc3Qgd2l0aG91dCBhbiBgYWNjZXNzX3Rva2VuYC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlbGVjdCBjbGllbnRzIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4gTW9zdCBjbGllbnRzIHNob3VsZCBjYWxsIC9pdGVtL2ltcG9ydCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IHVzZXJuYW1lIGhhc2hlZCBieSBGSS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBmaV91c2VybmFtZV9oYXNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlczogU2NvcGVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGR1cmluZyBlbnJvbGxtZW50LCB0aGlzIGZpZWxkIG11c3QgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHN0YXRlIHNlbnQgdG8gdGhlIHBhcnRuZXIgaW4gdGhlIE9BdXRoIExvZ2luIFVSSS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGBFTlJPTExNRU5UYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc0NvbnRleHR9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb250ZXh0OiBTY29wZXNDb250ZXh0O1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmsvYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua+KAmXMgdXBkYXRlIG1vZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgIGFuZCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXRlbVN0YXR1c051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcm9kdWN0IHN0cmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGh9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9hdXRoOiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGNvbmZpZ3VyZSBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlcuKAmXMgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogT3BhcXVlIHVzZXIgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXV0aG9yaXphdGlvbiB0b2tlbiBQbGFpZCB3aWxsIHVzZSB0byBhZ2dyZWdhdGUgdGhpcyB1c2Vy4oCZcyBhY2NvdW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1JbXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBoYXMgZXhpdGVkIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgZ29uZSB0aHJvdWdoIHRoZSB1cGRhdGUgbW9kZSBmbG93IGluIHlvdXIgYXBwICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXIgY29tcGxldGVkIHRoZSB1cGRhdGUgbW9kZSBpbiBhIGRpZmZlcmVudCBhcHApLiBJZiB5b3UgaGF2ZSBtZXNzYWdpbmcgdGhhdCB0ZWxscyB0aGUgdXNlciB0byBjb21wbGV0ZSB0aGUgdXBkYXRlIG1vZGUgZmxvdywgeW91IHNob3VsZCBzaWxlbmNlIHRoaXMgbWVzc2FnaW5nIHVwb24gcmVjZWl2aW5nIHRoZSBgTE9HSU5fUkVQQUlSRURgIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExPR0lOX1JFUEFJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgb25jZSBQbGFpZCBjYWxjdWxhdGVzIGluY29tZSBmcm9tIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGBwdWJsaWNfdG9rZW5gIGZvciB0aGUgcGFydGljdWxhciBJdGVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHdlYmhvb2sgZmlyZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSB3ZWJob29rIHdhcyBmaXJlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgc2VudF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3Qgd2ViaG9vayBjb2RlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgY29kZV9zZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgSXRlbS4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGFuIEl0ZW0sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSldLUHVibGljS2V5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBKV1RIZWFkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBkYXRlX29mX2JpcnRoYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmt5Y19jaGVja2AgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGBreWNfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBgc3RlcHMua3ljX2NoZWNrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tBZGRyZXNzU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzczogS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tOYW1lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogS1lDQ2hlY2tOYW1lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0lETnVtYmVyU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBLWUNDaGVja0lETnVtYmVyU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tQaG9uZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogS1lDQ2hlY2tQaG9uZVN1bW1hcnk7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGlkX251bWJlcmAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgbmFtZWAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgcGhvbmVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gICAgICovXG4gICAgYXJlYV9jb2RlOiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGxhc3QgdGltZSBlYWNoIGRhdGF0eXBlIHdhcyBhY2Nlc3NlZCBieSBhbiBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGFzdERhdGFBY2Nlc3NUaW1lcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhcHBsaWNhdGlvbiBhY2Nlc3NpbmcgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfYmFsYW5jZV9pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfYmFsYW5jZV9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgYWNjb3VudF9yb3V0aW5nX251bWJlciB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X3JvdXRpbmdfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY29udGFjdF9kZXRhaWxzIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNvbnRhY3RfZGV0YWlsczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHRyYW5zYWN0aW9ucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBjcmVkaXRfYW5kX2xvYW5zIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNyZWRpdF9hbmRfbG9hbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBpbnZlc3RtZW50cyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHBheXJvbGxfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luZm86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbl9yaXNrX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fcmlza19pbmZvOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBMSUFCSUxJVElFU2AgYW5kIGNvZGUgYERFRkFVTFRfVVBEQVRFYCB3aWxsIGJlIGZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgbGlhYmlsaXRpZXMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGEgbGlhYmlsaXRpZXMgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJQUJJTElUSUVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYFxcJ3MgZm9yIGFjY291bnRzIHRoYXQgY29udGFpbiBuZXcgbGlhYmlsaXRpZXMuXFwnXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19saWFiaWxpdGllczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlhYmlsaXRpZXMgZmllbGRzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJwYXN0X2Ftb3VudF9kdWVcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2xpYWJpbGl0aWVzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbGlhYmlsaXR5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjcmVkaXQgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIGNyZWRpdDogQXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3J0Z2FnZSBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIG1vcnRnYWdlOiBBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHVkZW50IGxvYW4gYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFN0dWRlbnRMb2FuPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBzdHVkZW50OiBBcnJheTxTdHVkZW50TG9hbj4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGxpYWJpbGl0eSBvYmplY3QsIGVpdGhlciBgY3JlZGl0YCBvciBgc3R1ZGVudGAuIE1vcnRnYWdlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIGN1c3RvbSBTYW5kYm94LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdXJjaGFzZSBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksIHRoaXMgaXMgdGhlIG9ubHkgaW50ZXJlc3QgcmF0ZSB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcmVzdCBjaGFyZ2VzLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHVyY2hhc2VfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNhc2ggQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjYXNoX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHRyYW5zZmVyIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgYmFsYW5jZV90cmFuc2Zlcl9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lhbCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNwZWNpYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsYXN0X3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYG1pbmltdW1fcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgIG9yIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX292ZXJkdWVgIGZpZWxkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBsb2FuIHByaW5jaXBhbC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmluY2lwYWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbm9taW5hbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludGVyZXN0IGNhcGl0YWxpemF0aW9uIGJlZ2lucyBhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1vbnRocyBhZnRlciBsb2FuIG9yaWdpbmF0aW9uLiBCeSBkZWZhdWx0IGludGVyZXN0IGlzIG5ldmVyIGNhcGl0YWxpemVkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGludGVyZXN0X2NhcGl0YWxpemF0aW9uX2dyYWNlX3BlcmlvZF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9kZWw6IFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWw7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBleHBlY3RlZF9wYXlvZmZfZGF0ZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGd1YXJhbnRvcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19mZWRlcmFsYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfZmVkZXJhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxvYW5fbmFtZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi5kZXNjcmlwdGlvbmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLnR5cGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC4gUG9zc2libGUgdmFsdWVzIGFyZTogYFxcXCJleHRlbmRlZCBncmFkdWF0ZWRcXFwiYCwgYFxcXCJleHRlbmRlZCBzdGFuZGFyZFxcXCJgLCBgXFxcImdyYWR1YXRlZFxcXCJgLCBgXFxcImluY29tZS1jb250aW5nZW50IHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1iYXNlZCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbnRlcmVzdCBvbmx5XFxcImAsIGBcXFwib3RoZXJcXFwiYCwgYFxcXCJwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJyZXZpc2VkIHBheSBhcyB5b3UgZWFyblxcXCJgLCBgXFxcInN0YW5kYXJkXFxcImAsIG9yIGBcXFwic2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBzZXF1ZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNlcXVlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNlcnZpY2VyX2FkZHJlc3M6IEFkZHJlc3M7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrIGZyb20gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhbGxiYWNrX3R5cGU/OiBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRXZlbnROYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGV2ZW50X25hbWU/OiBMaW5rRXZlbnROYW1lO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSBpbiB0aGUgZmxvdyB0aGUgTGluayB1c2VyIGV4aXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYWNjb3VudHMgd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2sgY29udGFpbmluZyBtZXRhZGF0YSBwcm94aWVkIG92ZXIgZnJvbSBMaW5rIGNhbGxiYWNrIGUuZyBgb25FdmVudGAsIGBvbkV4aXRgLCBgb25TdWNjZXNzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgTElOS19ERUxJVkVSWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTElOS19DQUxMQkFDS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0NhbGxiYWNrTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfY2FsbGJhY2tfbWV0YWRhdGE6IExpbmtDYWxsYmFja01ldGFkYXRhO1xufVxuLyoqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBtZXRob2QgY29udGFpbmluZyBib3RoIHRoZSB0eXBlIGFuZCBhZGRyZXNzIHRvIHNlbmQgdGhlIFVSTC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gICAgICovXG4gICAgbWV0aG9kPzogTGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciAvIGVtYWlsIGFkZHJlc3MgdGhhdCBIb3N0ZWQgTGluayBzZXNzaW9ucyBhcmUgZGVsaXZlcmVkIHRvLiBQaG9uZSBudW1iZXJzIG11c3QgYmUgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiBmcm9tIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IExpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY3JlYXRlZCBhdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uIHdhcyBjb21wbGV0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIFxcJ1dlbGxzIEZhcmdvXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBpbnN0aXR1dGlvbiBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgcmVsYXRlZCB0byB0aGUgZGVsaXZlcnkgb2YgdGhlIGxpbmsgc2Vzc2lvbiB0byB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2Q/OiBMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGRlbGl2ZXJ5X3N0YXR1cz86IExpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1cztcbn1cbi8qKlxuICogT3B0aW9uYWwgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5UmVjaXBpZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlPcHRpb25zXG4gICAgICovXG4gICAgcmVjaXBpZW50PzogTGlua0RlbGl2ZXJ5UmVjaXBpZW50O1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSByZWNpcGllbnQuIElmIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBwb3B1bGF0ZSB0aGlzIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUsIGxlYXZlIGl0IGJsYW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIHNlbmQgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gVVJMIHRvLiBJZiBkZWxpdmVyeSBpcyBub3QgcmVxdWlyZWQsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZHM/OiBBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPjtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdpbGwgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwgLyB0ZXh0IChpZiBjb25maWd1cmVkKS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24uICBgQ1JFQVRFRGA6IFRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWNjZXNzZWQgYnkgdGhlIHVzZXIgIGBPUEVORURgOiBUaGUgc2Vzc2lvbiBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgYnV0IG5vdCB5ZXQgY29tcGxldGVkICBgRVhJVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gZXhpdGVkIGJ5IHRoZSB1c2VyICBgQ09NUExFVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSB1c2VyICBgRVhQSVJFRGA6IFRoZSBzZXNzaW9uIGhhcyBleHBpcmVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzIHtcbiAgICBDcmVhdGVkID0gJ0NSRUFURUQnLFxuICAgIE9wZW5lZCA9ICdPUEVORUQnLFxuICAgIEV4aXRlZCA9ICdFWElURUQnLFxuICAgIENvbXBsZXRlZCA9ICdDT01QTEVURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgTGluayBjYWxsYmFjayBldmVudFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZSB7XG4gICAgU3VjY2VzcyA9ICdPTl9TVUNDRVNTJyxcbiAgICBFdmVudCA9ICdPTl9FVkVOVCcsXG4gICAgRXhpdCA9ICdPTl9FWElUJ1xufVxuXG4vKipcbiAqIFRoZSBjb21tdW5pY2F0aW9uIG1ldGhvZCB1c2VkIHRvIGRlbGl2ZXIgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgdG8gdGhlIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdXNlciB3YXMgZ29pbmcgdGhyb3VnaCBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWR1cGxpY2F0ZSBldmVudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBhbiBldmVudCB0aGF0IG9jY3VyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIGhhcyBlbmNvdW50ZXJlZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBNRkEgdHlwZXM6IGNvZGUsIGRldmljZSwgcXVlc3Rpb25zLCBzZWxlY3Rpb25zLiBFbWl0dGVkIGJ5OiBgU1VCTUlUX01GQWAgYW5kIGBUUkFOU0lUSU9OX1ZJRVdgIHdoZW4gdmlld19uYW1lIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQsIHdoaWNoIHdpbGwgYmUgZWl0aGVyIGByZXR1cm5pbmdfdXNlcmAgb3IgYHJvdXRpbmdfbnVtYmVyYC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1hdGNoX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgc3VibWl0dGVkIGJ5IHVzZXIgYXQgdGhlIG1pY3JvLWRlcG9zaXRzIHJvdXRpbmcgbnVtYmVyIHBhbmUuIEVtaXR0ZWQgYnkgYFNVQk1JVF9ST1VUSU5HX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgbWFzayBleHRyYWN0ZWQgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBhY2NvdW50IG51bWJlci4gSWYgdGhlIHVzZXItaW5wdXR0ZWQgYWNjb3VudCBudW1iZXIgaXMgZm91ciBkaWdpdHMgbG9uZywgYGFjY291bnRfbnVtYmVyX21hc2tgIGlzIGVtcHR5LiBFbWl0dGVkIGJ5IGBTVUJNSVRfQUNDT1VOVF9OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfbWFzaz86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGhhcyBqdXN0IG9jY3VycmVkIGluIHRoZSBMaW5rIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRXZlbnROYW1lIHtcbiAgICBCYW5rSW5jb21lSW5zaWdodHNDb21wbGV0ZWQgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfQ09NUExFVEVEJyxcbiAgICBDbG9zZU9hdXRoID0gJ0NMT1NFX09BVVRIJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgRXhpdCA9ICdFWElUJyxcbiAgICBGYWlsT2F1dGggPSAnRkFJTF9PQVVUSCcsXG4gICAgSGFuZG9mZiA9ICdIQU5ET0ZGJyxcbiAgICBPcGVuID0gJ09QRU4nLFxuICAgIE9wZW5NeVBsYWlkID0gJ09QRU5fTVlfUExBSUQnLFxuICAgIE9wZW5PYXV0aCA9ICdPUEVOX09BVVRIJyxcbiAgICBTZWFyY2hJbnN0aXR1dGlvbiA9ICdTRUFSQ0hfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEF1dGhUeXBlID0gJ1NFTEVDVF9BVVRIX1RZUEUnLFxuICAgIFNlbGVjdEJyYW5kID0gJ1NFTEVDVF9CUkFORCcsXG4gICAgU2VsZWN0RGVncmFkZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfREVHUkFERURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdERvd25JbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRE9XTl9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RmlsdGVyZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRklMVEVSRURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEluc3RpdHV0aW9uID0gJ1NFTEVDVF9JTlNUSVRVVElPTicsXG4gICAgU3VibWl0QWNjb3VudE51bWJlciA9ICdTVUJNSVRfQUNDT1VOVF9OVU1CRVInLFxuICAgIFN1Ym1pdENyZWRlbnRpYWxzID0gJ1NVQk1JVF9DUkVERU5USUFMUycsXG4gICAgU3VibWl0RG9jdW1lbnRzID0gJ1NVQk1JVF9ET0NVTUVOVFMnLFxuICAgIFN1Ym1pdERvY3VtZW50c0Vycm9yID0gJ1NVQk1JVF9ET0NVTUVOVFNfRVJST1InLFxuICAgIFN1Ym1pdERvY3VtZW50c1N1Y2Nlc3MgPSAnU1VCTUlUX0RPQ1VNRU5UU19TVUNDRVNTJyxcbiAgICBTdWJtaXRNZmEgPSAnU1VCTUlUX01GQScsXG4gICAgU3VibWl0Um91dGluZ051bWJlciA9ICdTVUJNSVRfUk9VVElOR19OVU1CRVInLFxuICAgIFRyYW5zaXRpb25WaWV3ID0gJ1RSQU5TSVRJT05fVklFVycsXG4gICAgVmlld0RhdGFUeXBlcyA9ICdWSUVXX0RBVEFfVFlQRVMnXG59XG5cbi8qKlxuICogQ29udGFpbnMgYSBzdW1tYXJ5IG9mIHRoZSBldmVudHMgZnJvbSBhIGxpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIGxpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgbGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIGxpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua19jb3JyZWxhdGlvbl9pZGAgZnJvbSBhIHJlY2VpdmVkIE9BdXRoIHJlZGlyZWN0IFVSSSBjYWxsYmFja1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2NvcnJlbGF0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGxpbmtfdG9rZW5gIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmUtaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb2ludCBhdCB3aGljaCB0aGUgdXNlciBleGl0ZWQgdGhlIExpbmsgZmxvdy4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBXZWxscyBGYXJnb2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgY29tcGxldGVkIExpbmsgc2Vzc2lvbiwgYWxvbmcgd2l0aCB0aGUgcHVibGljIHRva2VuIGlmIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU0VTU0lPTl9GSU5JU0hFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIExpbmsgc2Vzc2lvbi4gV2lsbCBhbHdheXMgYmUgXFxcIlNVQ0NFU1NcXFwiIG9yIFxcXCJFWElURURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvblN1Y2Nlc3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uc3VjY2VzcykgY2FsbGJhY2sgZnJvbSBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2VzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9zdGF0dXM/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKC9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgbnVsbGA6IG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBcXCdXZWxscyBGYXJnb1xcJ2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHRyYW5zZmVyLiBSZXR1cm5lZCBvbmx5IHdoZW4gW1RyYW5zZmVyIFVJXSgvZG9jcy90cmFuc2Zlci91c2luZy10cmFuc2Zlci11aSkgaXMgaW1wbGVtZW50ZWQuICAtIGBDT01QTEVURWAg4oCTIFRoZSB0cmFuc2ZlciB3YXMgY29tcGxldGVkLiAtIGBJTkNPTVBMRVRFYCDigJMgVGhlIHRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIEZvciBoZWxwLCBzZWUgW1Ryb3VibGVzaG9vdGluZyB0cmFuc2ZlcnNdKC9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpI3Ryb3VibGVzaG9vdGluZy10cmFuc2ZlcnMpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB7XG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnLFxuICAgIEluY29tcGxldGUgPSAnSU5DT01QTEVURSdcbn1cblxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgcHJvdmlkZSBsaW1pdGVkIGFjY291bnQgZmlsdGVyaW5nOiBpdCB3aWxsIG9ubHkgZGlzcGxheSBJbnN0aXR1dGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCwgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWNjb3VudHMgb3RoZXIgdGhhbiBgY2hlY2tpbmdgIGFuZCBgc2F2aW5nc2AgYWNjb3VudHMgb24gdGhlIEFjY291bnQgU2VsZWN0IHBhbmUuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIFRoZSBmaWx0ZXIgbWF5IG9yIG1heSBub3QgaW1wYWN0IHRoZSBsaXN0IG9mIGFjY291bnRzIHNob3duIGJ5IHRoZSBpbnN0aXR1dGlvbiBpbiB0aGUgT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBpbnN0aXR1dGlvbi4gSWYgdGhlIHVzZXIgc2VsZWN0cyBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzIGluIHRoZSBPQXV0aCBmbG93LCB0aGVzZSBhY2NvdW50cyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgSXRlbS4gSWYgdGhlIHVzZXIgc2VsZWN0cyBvbmx5IGV4Y2x1ZGVkIGFjY291bnQgc3VidHlwZXMsIHRoZSBsaW5rIGF0dGVtcHQgd2lsbCBmYWlsIGFuZCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHRyeSBhZ2Fpbi4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdGhlckZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBvdGhlcj86IE90aGVyRmlsdGVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBCSU4gKEJhbmsgSWRlbnRpZmljYXRpb24gTnVtYmVyKSBvZiB0aGUgY2FyZCB0byBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaFxuICAgICAqL1xuICAgIGNhcmRfYmluOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBPbmx5IGF2YWlsYWJsZSBmb3IgcGFydGljaXBhbnRzIGluIHRoZSBIb3N0ZWQgTGluayBiZXRhIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmsge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgZGVsaXZlcnlfbWV0aG9kPzogSG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFVSSSB0aGF0IEhvc3RlZCBMaW5rIHdpbGwgcmVkaXJlY3QgdG8gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBMaW5rIGZsb3cuIFRoaXMgd2lsbCBvbmx5IG9jY3VyIGluIEhvc3RlZCBMaW5rIHNlc3Npb25zLCBub3QgaW4gb3RoZXIgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGNvbXBsZXRpb25fcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IHNlY29uZHMgdGhlIGxpbmsgd2lsbCBiZSB2YWxpZCBmb3IuIE11c3QgYmUgcG9zaXRpdmUuIENhbm5vdCBiZSBsb25nZXIgdGhhbiAyMSBkYXlzLiBUaGUgZGVmYXVsdCBsaWZldGltZSBpcyA0IGhvdXJzLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgdXJsX2xpZmV0aW1lX3NlY29uZHM/OiBudW1iZXI7XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB1c2VkIHRvIGhpZ2hsaWdodCBpbnN0aXR1dGlvbnMgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3V0aW5nIG51bWJlciBvZiB0aGUgYmFuayB0byBoaWdobGlnaHQgaW4gTGluay4gTm90ZTogaW4gcmFyZSBjYXNlcywgYSBzaW5nbGUgcm91dGluZyBudW1iZXIgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtdWx0aXBsZSBpbnN0aXR1dGlvbnMsIGUuZy4gZHVlIHRvIGEgYnJva2VyYWdlIHVzaW5nIGFub3RoZXIgaW5zdGl0dXRpb24gdG8gbWFuYWdlIEFDSCBvbiBpdHMgc3dlZXAgYWNjb3VudHMuIElmIHRoaXMgaGFwcGVucywgdGhlIGJhbmsgd2lsbCBub3QgYmUgaGlnaGxpZ2h0ZWQgaW4gTGluayBldmVuIGlmIHRoZSByb3V0aW5nIG51bWJlciBpcyBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwbGljYXRpb24sIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gTGluay4gTWF4aW11bSBsZW5ndGggb2YgMzAgY2hhcmFjdGVycy4gSWYgYSB2YWx1ZSBsb25nZXIgdGhhbiAzMCBjaGFyYWN0ZXJzIGlzIHByb3ZpZGVkLCBMaW5rIHdpbGwgZGlzcGxheSBcXFwiVGhpcyBBcHBsaWNhdGlvblxcXCIgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFuZ3VhZ2UgdGhhdCBMaW5rIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4uIFdoZW4gaW5pdGlhbGl6aW5nIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkOyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0lkZW50aXR5IFZlcmlmaWNhdGlvbiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vI3N1cHBvcnRlZC1sYW5ndWFnZXMpLiAgU3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IC0gRGFuaXNoIChgXFwnZGFcXCdgKSAtIER1dGNoIChgXFwnbmxcXCdgKSAtIEVuZ2xpc2ggKGBcXCdlblxcJ2ApIC0gRXN0b25pYW4gKGBcXCdldFxcJ2ApIC0gRnJlbmNoIChgXFwnZnJcXCdgKSAtIEdlcm1hbiAoYFxcJ2RlXFwnYCkgLSBJdGFsaWFuIChgXFwnaXRcXCdgKSAtIExhdHZpYW4gKGBcXCdsdlxcJ2ApIC0gTGl0aHVhbmlhbiAoYFxcJ2x0XFwnYCkgLSBOb3J3ZWdpYW4gKGBcXCdub1xcJ2ApIC0gUG9saXNoIChgXFwncGxcXCdgKSAtIFBvcnR1Z3Vlc2UgKGBcXCdwdFxcJ2ApIC0gUm9tYW5pYW4gKGBcXCdyb1xcJ2ApIC0gU3BhbmlzaCAoYFxcJ2VzXFwnYCkgLSBTd2VkaXNoIChgXFwnc3ZcXCdgKSAgV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyZWQgaGVyZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5nIGluIHRoZSBjdXN0b21pemF0aW9uLCBvciB0aGUgY3VzdG9taXphdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2YgUGxhaWQtc3VwcG9ydGVkIGNvdW50cnkgY29kZXMgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluc3RpdHV0aW9ucyBmcm9tIGFsbCBsaXN0ZWQgY291bnRyaWVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGNvbXBsZXRlIG1hcHBpbmcgb2Ygc3VwcG9ydGVkIHByb2R1Y3RzIGJ5IGNvdW50cnksIHNlZSBodHRwczovL3BsYWlkLmNvbS9nbG9iYWwvLiAgSWYgdXNpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCBgY291bnRyeV9jb2Rlc2Agc2hvdWxkIGJlIHNldCB0byB0aGUgY291bnRyeSB3aGVyZSB5b3VyIGNvbXBhbnkgaXMgYmFzZWQsIG5vdCB0aGUgY291bnRyeSB3aGVyZSB5b3VyIHVzZXIgaXMgbG9jYXRlZC4gRm9yIGFsbCBvdGhlciBwcm9kdWN0cywgYGNvdW50cnlfY29kZXNgIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHlvdXIgdXNlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgSWYgTGluayBpcyBsYXVuY2hlZCB3aXRoIG11bHRpcGxlIGNvdW50cnkgY29kZXMsIG9ubHkgcHJvZHVjdHMgdGhhdCB5b3UgYXJlIGVuYWJsZWQgZm9yIGluIGFsbCBjb3VudHJpZXMgd2lsbCBiZSB1c2VkIGJ5IExpbmsuIE5vdGUgdGhhdCB3aGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCBhbmQgRGV2ZWxvcG1lbnQsIGluIFByb2R1Y3Rpb24gb25seSBVUyBhbmQgQ2FuYWRhIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEFjY2VzcyB0byBFdXJvcGVhbiBpbnN0aXR1dGlvbnMgcmVxdWlyZXMgYWRkaXRpb25hbCBjb21wbGlhbmNlIHN0ZXBzLiBUbyByZXF1ZXN0IGFjY2VzcyB0byBFdXJvcGVhbiBpbnN0aXR1dGlvbnMgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIFtmaWxlIGEgcHJvZHVjdCBhY2Nlc3MgU3VwcG9ydCB0aWNrZXRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9yZXF1ZXN0LXByb2R1Y3QtYWNjZXNzKSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC4gSWYgeW91IGluaXRpYWxpemUgd2l0aCBhIEV1cm9wZWFuIGNvdW50cnkgY29kZSwgeW91ciB1c2VycyB3aWxsIHNlZSB0aGUgRXVyb3BlYW4gY29uc2VudCBwYW5lbCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gIElmIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCBtYWtlIHN1cmUgdGhlIGNvdW50cnkgY29kZXMgaW4gdGhlIGN1c3RvbWl6YXRpb24gbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIGluIGBjb3VudHJ5X2NvZGVzYCwgb3IgdGhlIGN1c3RvbWl6YXRpb24gbWF5IG5vdCBiZSBhcHBsaWVkLiAgSWYgdXNpbmcgdGhlIEF1dGggZmVhdHVyZXMgSW5zdGFudCBNYXRjaCwgU2FtZS1kYXkgTWljcm8tZGVwb3NpdHMsIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cywgYGNvdW50cnlfY29kZXNgIG11c3QgYmUgc2V0IHRvIGBbXFwnVVNcXCddYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2UuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIEluY29tZSBvciBBc3NldHMgdG8gYW4gSXRlbSk7IHJlcXVpcmVkIG90aGVyd2lzZS4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbml0aWFsaXplZCB3aGVuIGFueSBvdGhlciBwcm9kdWN0IGlzIGluaXRpYWxpemVkLiAgVGhlIHByb2R1Y3RzIHNwZWNpZmllZCBoZXJlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIGluc3RpdHV0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3VyIHVzZXJzIGluIExpbmsuIE9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCAqYWxsKiByZXF1ZXN0ZWQgcHJvZHVjdHMgY2FuIGJlIHNlbGVjdGVkOyBhIGlmIGEgdXNlciBhdHRlbXB0cyB0byBzZWxlY3QgYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEgbGlzdGVkIHByb2R1Y3QsIGEgXFxcIkNvbm5lY3Rpdml0eSBub3Qgc3VwcG9ydGVkXFxcIiBlcnJvciBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIExpbmsuIFRvIG1heGltaXplIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UuIEFkZGl0aW9uYWwgcHJvZHVjdHMgY2FuIGJlIGluY2x1ZGVkIHZpYSB0aGUgW2BvcHRpb25hbF9wcm9kdWN0c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXJlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykgZmllbGRzLCBvciBjYW4gYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB0aGUgZW5kcG9pbnQgYWZ0ZXIgb2J0YWluaW5nIGFuIGFjY2VzcyB0b2tlbi4gRm9yIGRldGFpbHMgYW5kIGV4Y2VwdGlvbnMsIHNlZSBbQ2hvb3Npbmcgd2hlbiB0byBpbml0aWFsaXplIHByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLykuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZSBvbmx5IGlmIHRoZSBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudChzKSBzZWxlY3RlZCBieSB0aGUgdXNlciBzdXBwb3J0IHRoZSBwcm9kdWN0LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuIFRoZSBwcm9kdWN0cyB3aWxsIG9ubHkgYmUgZXh0cmFjdGVkIGFuZCBiaWxsZWQgaWYgdGhlIHVzZXIgc2VsZWN0cyBhbiBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudCB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlbS4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXlzLiBUaGUgYHByb2R1Y3RzYCBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByb2R1Y3QuICBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoaXMgZmVhdHVyZSwgc2VlIFtSZXF1aXJlZCBpZiBTdXBwb3J0ZWQgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHlvdSBtYXkgd2lzaCB0byB1c2UgYnV0IHRoYXQgYXJlIG5vdCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGZldGNoIGRhdGEgZm9yIHRoZXNlIHByb2R1Y3RzIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMsIGFuZCBmYWlsdXJlIHRvIHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYWZmZWN0IEl0ZW0gY3JlYXRpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW09wdGlvbmFsIFByb2R1Y3RzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jb3B0aW9uYWwtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25hbF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogKEJldGEpIFRoaXMgZmllbGQgaGFzIG5vIGVmZmVjdCB1bmxlc3MgeW91IGFyZSBwYXJ0aWNpcGF0aW5nIGluIHRoZSBbRGF0YSBUcmFuc3BhcmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKSBiZXRhIHByb2dyYW0uIExpc3Qgb2YgYWRkaXRpb25hbCBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIGNvbGxlY3QgY29uc2VudCBmb3IuIFRoZXNlIHByb2R1Y3RzIHdpbGwgbm90IGJlIGJpbGxlZCB1bnRpbCB5b3Ugc3RhcnQgdXNpbmcgdGhlbSBieSBjYWxsaW5nIHRoZSByZWxldmFudCBlbmRwb2ludHMuICBgYmFsYW5jZWAgaXMgKm5vdCogYSB2YWxpZCB2YWx1ZSwgdGhlIEJhbGFuY2UgcHJvZHVjdCBkb2VzIG5vdCByZXF1aXJlIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBjb25zZW50IGNvbGxlY3RlZC4gIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2Agb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXlzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuIE5vdGUgdGhhdCB3ZWJob29rcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIChlLXdhbGxldCB0cmFuc2FjdGlvbnMgb25seSksIFRyYW5zZmVyLCBCYW5rIFRyYW5zZmVyIChpbmNsdWRpbmcgQXV0aCBtaWNyby1kZXBvc2l0IG5vdGlmaWNhdGlvbiB3ZWJob29rcykgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhcmUgY29uZmlndXJlZCB2aWEgdGhlIERhc2hib2FyZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gdG8gdXBkYXRlIG9yIHJlZmVyZW5jZSwgdXNlZCB3aGVuIHVwZGF0aW5nLCBtb2RpZnlpbmcsIG9yIGFjY2Vzc2luZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYC4gVXNlZCB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCB3aGVuIGNvbXBsZXRpbmcgdGhlIFNhbWUtZGF5IChtYW51YWwpIE1pY3JvLWRlcG9zaXQgZmxvdywgb3IgKG9wdGlvbmFsbHkpIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsgZm9yIGEgcmV0dXJuaW5nIHVzZXIgYXMgcGFydCBvZiB0aGUgVHJhbnNmZXIgVUkgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW1zIHRvIHVwZGF0ZSBpbiBMaW5rIHVwZGF0ZSBtb2RlIGZvciB0aGUgQXNzZXRzIHByb2R1Y3QuIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiB0aGUgYGFjY2Vzc190b2tlbmAgZmllbGQgYWxsb3dzIHRoZSB1cGRhdGluZyBvZiBtdWx0aXBsZSBpdGVtcyBhdCBvbmNlLiBUaGlzIGZlYXR1cmUgaXMgaW4gY2xvc2VkIGJldGEsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm8uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgTGluayBjdXN0b21pemF0aW9uIGZyb20gdGhlIFBsYWlkIERhc2hib2FyZCB0byBiZSBhcHBsaWVkIHRvIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgZGVmYXVsdGAgY3VzdG9taXphdGlvbiB3aWxsIGJlIHVzZWQuIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBpbiB0aGUgY3VzdG9taXphdGlvbiBtdXN0IG1hdGNoIHRoZSBsYW5ndWFnZSBzZWxlY3RlZCB2aWEgdGhlIGBsYW5ndWFnZWAgcGFyYW1ldGVyLCBhbmQgdGhlIGNvdW50cmllcyBpbiB0aGUgY3VzdG9taXphdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGNvdW50cnkgY29kZXMgc2VsZWN0ZWQgdmlhIGBjb3VudHJ5X2NvZGVzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jdXN0b21pemF0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkkgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24gd2hlcmUgYSB1c2VyIHNob3VsZCBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciB2aWEgYSB3ZWJ2aWV3LiBUaGUgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCwgbXVzdCBiZSBhbiBodHRwcyBVUkkuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIElmIGluaXRpYWxpemluZyBvbiBBbmRyb2lkLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgc3BlY2lmaWVkIGluc3RlYWQgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSBsZWZ0IGJsYW5rLiBJZiB1c2luZyBIb3N0ZWQgTGluayAoYmV0YSkgdGhlIGByZWRpcmVjdF91cmlgIG11c3QgYmUgc2V0IHRvIGBodHRwczovL2hvc3RlZC5wbGFpZC5jb20vb2F1dGgvcmVkaXJlY3RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIGBsaW5rX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgb24gQW5kcm9pZC4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBXaGVuIGNyZWF0aW5nIGEgYGxpbmtfdG9rZW5gIGZvciBpbml0aWFsaXppbmcgTGluayBvbiBvdGhlciBwbGF0Zm9ybXMsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBsZWZ0IGJsYW5rIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbmRyb2lkX3BhY2thZ2VfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhcmRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQWNjb3VudEZpbHRlcnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBMaW5rVG9rZW5BY2NvdW50RmlsdGVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuRVVDb25maWd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldV9jb25maWc/OiBMaW5rVG9rZW5FVUNvbmZpZztcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBjZXJ0YWluIEV1cm9wZS1vbmx5IGNvbmZpZ3VyYXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gbGVnYWN5IHVzZSBjYXNlcyBpbiBvdGhlciByZWdpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZT86IENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGg/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXI/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1cGRhdGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciB0b2tlbiBnZW5lcmF0ZWQgdXNpbmcgYC91c2VyL2NyZWF0ZWAuIEFueSBJdGVtIGNyZWF0ZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBMaW5rVG9rZW5JbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHNBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfYXV0aD86IExpbmtUb2tlbkludmVzdG1lbnRzQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGhvc3RlZF9saW5rPzogTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogTGlua1Rva2VuVHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgcmVxdWVzdCBhIENSQSBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JhX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgb25seSBkaXNwbGF5IGFjY291bnQgdHlwZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuICBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBGb3IgaW5zdGl0dXRpb25zIHVzaW5nIE9BdXRoLCB0aGUgZmlsdGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgbGlzdCBvZiBpbnN0aXR1dGlvbnMgb3IgYWNjb3VudHMgc2hvd24gYnkgdGhlIGJhbmsgaW4gdGhlIE9BdXRoIHdpbmRvdy4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEF1dGggcHJvZHVjdC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlbmRlZCBBdXRoIGZsb3dzIGZvciB0aGUgcmVzdWx0aW5nIExpbmsgc2Vzc2lvbi4gT21pdHRpbmcgYW55IGZpZWxkIHdpbGwgcmVzdWx0IGluIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGgge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIEF1dGggVHlwZSBTZWxlY3QgaXMgZW5hYmxlZCBmb3IgdGhlIExpbmsgc2Vzc2lvbiwgYWxsb3dpbmcgdGhlIGVuZCB1c2VyIHRvIGNob29zZSBiZXR3ZWVuIGxpbmtpbmcgaW5zdGFudGx5IG9yIG1hbnVhbGx5IHByaW9yIHRvIHNlbGVjdGluZyB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IGJlIHRydWUgaWYgYHNhbWVfZGF5X21pY3JvZGVwb3NpdHNfZW5hYmxlZGAgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRvbWF0ZWRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBJbnN0YW50IE1hdGNoIGZsb3cuIEFzIG9mIE5vdmVtYmVyIDIwMjIsIEluc3RhbnQgTWF0Y2ggd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEluc3RhbnQgTWF0Y2ggY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBzYW1lX2RheV9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBbUmVyb3V0ZSB0byBDcmVkZW50aWFsc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3NhbWUtZGF5LyNyZXJvdXRlLXRvLWNyZWRlbnRpYWxzKSBwYW5lIHNob3VsZCBiZSB1c2VkIGluIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSBTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93LiBBcyBvZiBPY3RvYmVyIDE1IDIwMjMsIHRoZSBkZWZhdWx0IHNldHRpbmcgaXMgYE9QVElPTkFMYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHJlcm91dGVfdG9fY3JlZGVudGlhbHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGRhdGFiYXNlX21hdGNoX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZmxvd190eXBlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhSZXJvdXRlVG9DcmVkZW50aWFsc0VudW0ge1xuICAgIE9mZiA9ICdPRkYnLFxuICAgIE9wdGlvbmFsID0gJ09QVElPTkFMJyxcbiAgICBGb3JjZWQgPSAnRk9SQ0VEJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bSB7XG4gICAgRmxleGlibGVBdXRoID0gJ0ZMRVhJQkxFX0FVVEgnXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQmFzZSBSZXBvcnQgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgYXNzZXRzYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgdGhlIGNsaWVudCBpcyBDUkEtZW5hYmxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBgZGVwb3NpdF9zd2l0Y2hfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBFbXBsb3ltZW50IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95bWVudF9zb3VyY2VfdHlwZXM/OiBBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWU7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggQmFuayBFbXBsb3ltZW50LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgZW1wbG95bWVudF9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb24gZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBJbmNvbWUgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSwgYXMgcHJvdmlkZWQgYnkgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIHRoYXQgYSB1c2VyIGhhcyBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoLiBEYXRhIGZyb20gdGhlc2UgaW5zdGl0dXRpb25zIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIGRvY3VtZW50IGRhdGEgcmVjZWl2ZWQgZHVyaW5nIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBoZWxwIHZlcmlmeSB0aGF0IHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgYXJlIGFjY3VyYXRlLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGVzZSBJdGVtcyBkdXJpbmcgbGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi4gIFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgcGF5cm9sbGAgaW5jb21lIHNvdXJjZSB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdGVkX2luY29tZV9zb3VyY2VzPzogQXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgbXVsdGlwbGUgSXRlbXMgdG8gYmUgYWRkZWQgaW4gdGhlIExpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGVuYWJsZV9tdWx0aXBsZV9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIFBheXJvbGwgSW5jb21lIChpbmNsdWRpbmcgRG9jdW1lbnQgSW5jb21lKS4gRnVydGhlciBjdXN0b21pemF0aW9uIG9wdGlvbnMgZm9yIERvY3VtZW50IEluY29tZSwgc3VjaCBhcyBjdXN0b21pemluZyB3aGljaCBkb2N1bWVudCB0eXBlcyBtYXkgYmUgdXBsb2FkZWQsIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFtMaW5rIEN1c3RvbWl6YXRpb24gcGFuZV0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmspIGluIHRoZSBEYXNoYm9hcmQuIChSZXF1aXJlcyBQcm9kdWN0aW9uIGVuYWJsZW1lbnQuKVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gdG8gZW5hYmxlIGZvciB0aGUgTGluayBzZXNzaW9uLiBJZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlcnMgd2lsbCBzZWUgYm90aCBkb2N1bWVudCBhbmQgZGlnaXRhbCBwYXlyb2xsIGluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBmbG93X3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIExpbmsgdG9rZW4gd2lsbCBiZSB1c2VkIGZvciB1cGRhdGUgbW9kZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBpc191cGRhdGVfbW9kZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBJdGVtIHRvIHVwZGF0ZSB3aXRoLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGl0ZW1faWRfdG9fdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCB1cGxvYWRzLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBkb2NzIHdpbGwgdW5kZXJnbyBPQ1IgcGFyc2luZyBvbmx5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+IHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgU3RhdGVtZW50cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSDigJxZWVlZLU1NLURE4oCdIGZvcm1hdCwgZS5nLiBcXFwiMjAyMC0xMC0zMFxcXCIuIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byAzIG1vbnRocyBwcmlvciB0byB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IGRhdGUuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBUcmFuc2ZlciBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGVuYWJsZXMgW3VwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgdXNlIE9BdXRoLCBvciB0aGF0IHVzZSBPQXV0aCBidXQgZG8gbm90IGhhdmUgdGhlaXIgb3duIGFjY291bnQgc2VsZWN0aW9uIGZsb3cuIEZvciBpbnN0aXR1dGlvbnMgdGhhdCBoYXZlIGFuIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3cgKGkuZS4gbW9zdCBPQXV0aC1lbmFibGVkIGluc3RpdHV0aW9ucyksIHVwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3Qgd2lsbCBhbHdheXMgYmUgZW5hYmxlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfc2VsZWN0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgd2hvIHdpbGwgYmUgbGlua2luZyB0aGVpciBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgYSB1c2VyIElEIG51bWJlciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuIEl0IGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgbWVhbnMgb2Ygc2VhcmNoaW5nIGxvZ3MgZm9yIHRoZSBnaXZlbiB1c2VyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUsIHVzZWQgZm9yIFttaWNyby1kZXBvc2l0IGJhc2VkIHZlcmlmaWNhdGlvbiBmbG93c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIEZvciBhIHNtYWxsIG51bWJlciBvZiBjdXN0b21lcnMgb24gbGVnYWN5IGZsb3dzLCBwcm92aWRpbmcgdGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBlbmFibGUgbWljcm8tZGVwb3NpdC1iYXNlZCBmbG93cy4gRm9yIGFsbCBvdGhlciBjdXN0b21lcnMsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCBwcm92aWRpbmcgdGhlIHVzZXJcXCdzIG5hbWUgaW4gdGhpcyBmaWVsZCB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHdpbGwgZW5hYmxlIGNlcnRhaW4gcmlzayBjaGVja3MgYW5kIGNhbiByZWR1Y2UgbWljcm8tZGVwb3NpdCBmcmF1ZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgdGhlIFtwcmUtYXV0aGVudGljYXRlZCByZXR1cm5pbmcgdXNlciBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIvI3ByZS1hdXRoZW50aWNhdGVkLXJ1eCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBlbWFpbCBhZGRyZXNzIHdhcyB2ZXJpZmllZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGlzIHdhcyBwcmV2aW91c2x5IGFuIG9wdGlvbmFsIGZpZWxkIHVzZWQgaW4gdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBlbmFibGUgdGhlIHJldHVybmluZyB1c2VyIGV4cGVyaWVuY2UuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdGhhdCB5b3UgaGF2ZSB2ZXJpZmllZC4gSWYgeW91IGhhdmUgcGVyZm9ybWVkIHZlcmlmaWNhdGlvbiBidXQgZG9u4oCZdCBoYXZlIHRoZSB0aW1lLCB5b3UgbWF5IHN1cHBseSBhIHNpZ25hbCB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIFVOSVggZXBvY2guICAgRXhhbXBsZTogYDIwMjAtMDEtMDFUMDA6MDA6MDBaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzX3ZlcmlmaWVkX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgYW5kIG5vdCBjdXJyZW50bHkgdXNlZCwgdXNlIHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFVzZXJJRE51bWJlcjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHVzZXIgc3RhdGVkIGluY29tZSBzb3VyY2VzIGZvciB0aGUgSW5jb21lIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgY29ycmVzcG9uZGluZyB0byBhbiBpbmNvbWUgc291cmNlIHNwZWNpZmllZCBieSB0aGUgdXNlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIHBlciBjeWNsZSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X3Blcl9jeWNsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIGFubnVhbGx5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfYW5udWFsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfdHlwZT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5O1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3Vycy4gQSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIG9mIGEgUGxhaWQtaG9zdGVkIExpbmsgZmxvdyB0aGF0IHdpbGwgdXNlIHRoZSBMaW5rIHRva2VuIHJldHVybmVkIGJ5IHRoaXMgcmVxdWVzdC4gT25seSBwcmVzZW50IGlmIHRoZSBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaG9zdGVkX2xpbmtfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5FVUNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBvcGVuIExpbmsgd2l0aG91dCBhbiBpbml0aWFsIFVJLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5FVUNvbmZpZ1xuICAgICAqL1xuICAgIGhlYWRsZXNzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50cyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWN0c2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGB3ZWJob29rYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb3VudHJ5X2NvZGVzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGxhbmd1YWdlYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9kYXRhPzogTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50RmlsdGVyc1Jlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogQWNjb3VudEZpbHRlcnNSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlZGlyZWN0X3VyaWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfbmFtZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX3Rva2VuYCwgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIHRvIExpbmsgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBpdCBhbmQgcmVjZWl2ZSBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBMaW5rIHNlc3Npb25zIGNyZWF0ZWQgdXNpbmcgdGhpcyBgbGlua190b2tlbmAuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgeW91ciBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19zZXNzaW9ucz86IEFycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBsaW5rIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgeW91ciBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBsaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmlyc3Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGFydGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmluaXNoZWQsIGlmIGF2YWlsYWJsZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmaW5pc2hlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIG9uX3N1Y2Nlc3M/OiBMaW5rU2Vzc2lvblN1Y2Nlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbl9leGl0PzogTGlua1Nlc3Npb25FeGl0IHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYWxsb3cgc2VsZi1jdXN0b2R5IGNyeXB0byB3YWxsZXRzIHRvIGJlIGFkZGVkIHdpdGhvdXQgcmVxdWlyaW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWxsb3dfdW52ZXJpZmllZF9jcnlwdG9fd2FsbGV0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyB1c2VycyB0byBtYW51YWxseSBlbnRlciBJbnZlc3RtZW50cyBhY2NvdW50IGFuZCBob2xkaW5ncyBpbmZvcm1hdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd19tYW51YWxfZW50cnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBJbnZlc3RtZW50cyBBdXRoIFByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIGFmdGVyIERlY2VtYmVyIDMsIDIwMjMsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIG9uIERlY2VtYmVyIDMsIDIwMjMgb3IgZWFybGllciwgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA3MzAgZGF5cyB1bnRpbCBKdW5lIDI0LCAyMDI0LCBhdCB3aGljaCBwb2ludCBpdCB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB1dGlsaXppbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5UcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogV2ViaG9vayBpbmRpY2F0aW5nIHRoYXQgdGhlIHN0YXR1cyBvZiB0aGUgZGVsaXZlcnkgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gdG8gYSB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBMSU5LX0RFTElWRVJZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFTElWRVJZX1NUQVRVU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9tZXRhZGF0YTogTGlua0RlbGl2ZXJ5TWV0YWRhdGE7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9ydGdhZ2UgbG9hbiBhZ3JlZW1lbnQgYmV0d2VlbiBvbmUgb3IgbW9yZSBib3Jyb3dlcnMgYW5kIGEgbW9ydGdhZ2UgbGVuZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMb2FuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgTG9hblxuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUlM6IExvYW5JZGVudGlmaWVycztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgbG9hbiBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWxvYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTG9hbkFjY291bnRTdWJ0eXBlIHtcbiAgICBBdXRvID0gJ2F1dG8nLFxuICAgIEJ1c2luZXNzID0gJ2J1c2luZXNzJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIENvbnN0cnVjdGlvbiA9ICdjb25zdHJ1Y3Rpb24nLFxuICAgIENvbnN1bWVyID0gJ2NvbnN1bWVyJyxcbiAgICBIb21lRXF1aXR5ID0gJ2hvbWUgZXF1aXR5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIE1vcnRnYWdlID0gJ21vcnRnYWdlJyxcbiAgICBMaW5lT2ZDcmVkaXQgPSAnbGluZSBvZiBjcmVkaXQnLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBsb2FuIGJ5IHZhcmlvdXMgcGFydGllcyB0byB0aGUgdHJhbnNhY3Rpb24gb3Igb3RoZXIgb3JnYW5pemF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllclxuICAgICAqL1xuICAgIExvYW5JZGVudGlmaWVyVHlwZTogTG9hbklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGxvYW4gaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5JZGVudGlmaWVyVHlwZSB7XG4gICAgTGVuZGVyTG9hbiA9ICdMZW5kZXJMb2FuJyxcbiAgICBVbml2ZXJzYWxMb2FuID0gJ1VuaXZlcnNhbExvYW4nXG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuSWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBMb2FuSWRlbnRpZmllcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxvYW5zIHRoYXQgYXJlIHBhcnQgb2YgYSBzaW5nbGUgZGVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW59XG4gICAgICogQG1lbWJlcm9mIExvYW5zXG4gICAgICovXG4gICAgTE9BTjogTG9hbjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTUZBIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogU3VtbWFyeSBvYmplY3QgcmVmbGVjdGluZyB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBhc3NvY2lhdGVkIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNYXRjaFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGEgdXNlcuKAmXMgdG9wIG1lcmNoYW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIGlkIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggbWVyY2hhbnQgb2YgdGhpcyB0eXBlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9kZXRhaWxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xufVxuLyoqXG4gKiBBbGxvd3Mgc3BlY2lmeWluZyB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbGltaXRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbWFzay4gU2hvdWxkIGJlIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZyBvZiAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIFRoaXMgYWxsb3dzIHlvdSB0byBtb2RlbCBhIG1hc2sgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIChzdWNoIGFzIHdpdGggYSB2aXJ0dWFsIGFjY291bnQgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG91dHN0YW5kaW5nIGFtb3VudCBjaGFyZ2VkIGZvciBsYXRlIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBjdXJyZW50X2xhdGVfZmVlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBoZWxkIGluIGVzY3JvdyB0byBwYXkgdGF4ZXMgYW5kIGluc3VyYW5jZSBvbiBiZWhhbGYgb2YgdGhlIGJvcnJvd2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgZXNjcm93X2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIGhhcyBwcml2YXRlIG1vcnRnYWdlIGluc3VyYW5jZSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3BtaTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIHdpbGwgcGF5IGEgcGVuYWx0eSBmb3IgZWFybHkgcGF5b2ZmIG9mIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wcmVwYXltZW50X3BlbmFsdHk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZUludGVyZXN0UmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlOiBNb3J0Z2FnZUludGVyZXN0UmF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgbG9hbiwgZm9yIGV4YW1wbGUgYGNvbnZlbnRpb25hbGAsIGBmaXhlZGAsIG9yIGB2YXJpYWJsZWAuIFRoaXMgZmllbGQgaXMgcHJvdmlkZWQgZGlyZWN0bHkgZnJvbSB0aGUgbG9hbiBzZXJ2aWNlciBhbmQgZG9lcyBub3QgaGF2ZSBhbiBlbnVtZXJhdGVkIHNldCBvZiBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3R5cGVfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRnVsbCBkdXJhdGlvbiBvZiBtb3J0Z2FnZSBhcyBhdCBvcmlnaW5hdGlvbiAoZS5nLiBgMTAgeWVhcmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90ZXJtOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmFsIGRhdGUgb24gd2hpY2ggbW9ydGdhZ2UgaXMgZHVlIGluIGZ1bGwuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBuZXh0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X21vbnRobHlfcGF5bWVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBsb2FuIChwcmluY2lwYWwgKyBpbnRlcmVzdCkgcGFzdCBkdWUgZm9yIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwYXN0X2R1ZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlUHJvcGVydHlBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHByb3BlcnR5X2FkZHJlc3M6IE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgaW50ZXJlc3QgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBZVEQgcHJpbmNpcGFsIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZpZWxkcyBkZXNjcmliaW5nIHByb3BlcnR5IGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZml2ZSBvciBuaW5lIGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSAoZXhhbXBsZSBcXFwiTkNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyAoZXhhbXBsZSBcXFwiNTY0IE1haW4gU3RyZWV0LCBBcHQgMTVcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgcmlzayBzaWduYWxzIGFuZCByZWxldmFudCBtZXRhZGF0YSBmb3IgYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBhdHRyaWJ1dGVzIHRoYXQgY291bGQgaW5kaWNhdGUgaWYgYSBkb2N1bWVudCBpcyBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge0FycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZG9jdW1lbnRfcmVmZXJlbmNlczogQXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBhdHRyaWJ1dGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlcmUgaXMgZnJhdWQgcmlzayB3aXRoIGEgc2V0IG9mIGRvY3VtZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogU2NvcmUgZm91bmQgYnkgbWF0Y2hpbmcgbmFtZSBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIG5hbWUgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBuYW1lLiAxMDAgaXMgYSBwZXJmZWN0IHNjb3JlLCA5OS04NSBtZWFucyBhIHN0cm9uZyBtYXRjaCwgODQtNzAgaXMgYSBwYXJ0aWFsIG1hdGNoLCBhbnkgc2NvcmUgbGVzcyB0aGFuIDcwIGlzIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgbmFtZSBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogZmlyc3Qgb3IgbGFzdCBuYW1lIGNvbXBsZXRlbHkgbWF0Y2hlZCwgbGlrZWx5IGEgZmFtaWx5IG1lbWJlclxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX2ZpcnN0X25hbWVfb3JfbGFzdF9uYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogbmlja25hbWUgbWF0Y2hlZCwgZXhhbXBsZSBKZW5uaWZlciBhbmQgSmVubi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19uaWNrbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElzIGB0cnVlYCBpZiB0aGUgbmFtZSBvbiBlaXRoZXIgb2YgdGhlIG5hbWVzIHRoYXQgd2FzIG1hdGNoZWQgZm9yIHRoZSBzY29yZSBjb250YWluZWQgc3RyaW5ncyBpbmRpY2F0aXZlIG9mIGEgYnVzaW5lc3MgbmFtZSwgc3VjaCBhcyBcXFwiQ09SUFxcXCIsIFxcXCJMTENcXFwiLCBcXFwiSU5DXFxcIiwgb3IgXFxcIkxURFxcXCIuIEEgYHRydWVgIHJlc3VsdCBnZW5lcmFsbHkgaW5kaWNhdGVzIHRoZSBlbnRpdHkgaXMgYSBidXNpbmVzcy4gSG93ZXZlciwgYSBgZmFsc2VgIHJlc3VsdCBkb2VzIG5vdCBtZWFuIHRoZSBlbnRpdHkgaXMgbm90IGEgYnVzaW5lc3MsIGFzIHNvbWUgYnVzaW5lc3NlcyBkbyBub3QgdXNlIHRoZXNlIHN0cmluZ3MgaW4gdGhlIG5hbWVzIHVzZWQgZm9yIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzX2J1c2luZXNzX25hbWVfZGV0ZWN0ZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldFBheVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsPzogVG90YWw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gUGxhaWQgZGV0ZWN0cyBhIG5ldyBhY2NvdW50IGZvciBJdGVtcyBjcmVhdGVkIG9yIHVwZGF0ZWQgd2l0aCBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IGNhbiBwcm9tcHQgeW91ciB1c2VycyB0byBzaGFyZSBuZXcgYWNjb3VudHMgd2l0aCB5b3UgdGhyb3VnaCBbQWNjb3VudCBTZWxlY3QgdjIgdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF93aXJlX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGluc3RpdHV0aW9uIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfYnJhbmNoYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2luc3RpdHV0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBicmFuY2ggbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9pbnN0aXR1dGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9icmFuY2g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFuayBpZGVudGlmaWVyIGNvZGUgKEJJQykuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9pYmFuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9iaWM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgbnVtYmVyIChJQkFOKS4gSWYgbm8gYWNjb3VudCBudW1iZXIgaXMgc3BlY2lmaWVkIHZpYSBgYWNjb3VudGAsIHdpbGwgYWxzbyBiZSB1c2VkIGFzIHRoZSBhY2NvdW50IG51bWJlciBieSBkZWZhdWx0LiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfYmljYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9pYmFuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJBQ1Mgc29ydCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3Nfc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFDQVRTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNBVFNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0FUUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVycyBmb3IgdGhlIGNsZWFyaW5naG91c2VzIHRoYXQgYXJlIGFzc29jY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaW4gb3JkZXIgb2YgcmVsZXZhbmNlLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgd2UgY2FuXFwndCBwcm92aWRlIGFueSBhY2NvdW50IGxldmVsIGRhdGEuIEluc3RpdHV0aW9uIGxldmVsIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbnN0aXR1dGlvbnMvZ2V0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgZHRjX251bWJlcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNIXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNIIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgT0F1dGggd2l0aCBDaGFzZSBCYW5rIChgaW5zXzU2YCksIENoYXNlIHdpbGwgaXNzdWUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGVzZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIChhbHNvIGtub3duIGFzIFRBTnMpIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIGBtYXNrYCBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcjsgZm9yIHRoaXMgcmVhc29uLCB3aGVuIGRpc3BsYXlpbmcgYWNjb3VudCBudW1iZXJzIHRvIHRoZSB1c2VyIHRvIGhlbHAgdGhlbSBpZGVudGlmeSB0aGVpciBhY2NvdW50IGluIHlvdXIgVUksIGFsd2F5cyB1c2UgdGhlIGBtYXNrYCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIHRoZSBgYWNjb3VudGAgbnVtYmVyLiBJZiBhIHVzZXIgcmV2b2tlcyB0aGVpciBwZXJtaXNzaW9ucyB0byB5b3VyIGFwcCwgdGhlIHRva2VuaXplZCBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gSWYgdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfNTZgLCB0aGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBhY2NvdW50YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNITnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgT0F1dGggd2l0aCBDaGFzZSBCYW5rIChgaW5zXzU2YCksIENoYXNlIHdpbGwgaXNzdWUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGVzZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIChhbHNvIGtub3duIGFzIFRBTnMpIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIGBtYXNrYCBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcjsgZm9yIHRoaXMgcmVhc29uLCB3aGVuIGRpc3BsYXlpbmcgYWNjb3VudCBudW1iZXJzIHRvIHRoZSB1c2VyIHRvIGhlbHAgdGhlbSBpZGVudGlmeSB0aGVpciBhY2NvdW50IGluIHlvdXIgVUksIGFsd2F5cyB1c2UgdGhlIGBtYXNrYCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIHRoZSBgYWNjb3VudGAgbnVtYmVyLiBJZiBhIHVzZXIgcmV2b2tlcyB0aGVpciBwZXJtaXNzaW9ucyB0byB5b3VyIGFwcCwgdGhlIHRva2VuaXplZCBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBJZiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc181NmAsIHRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGFjY291bnRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQsIGlmIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfaW4/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgb3V0IG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9vdXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50IHZpYSBBVE9OLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQVRPTlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FUT04ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBVE9OXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBVE9OXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJBQ1MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQkFDUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIENhbmFkaWFuIGJhbmsgYWNjb3VudCB2aWEgRUZULlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGUge1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYW4gaW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgdmlhIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyB1c2luZyB0aGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIGFuZCBCSUMvU1dJRlQgY29kZSBmb3JtYXQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhbiBpbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCB2aWEgd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT21pdHRhYmxlVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBvcHRpb24gc2VjdXJpdHkuICBGb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZGF0YSBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaWYgdGhlIGl0ZW0gaXMgdXNpbmcgYSBjdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3QsIGFuZCB0aGUgYHRpY2tlcmAgZmllbGQgb2YgdGhlIGN1c3RvbSBzZWN1cml0eSBmb2xsb3dzIHRoZSBbT0NDIE9wdGlvbiBTeW1ib2xdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wdGlvbl9zeW1ib2wjVGhlX09DQ19PcHRpb25fU3ltYm9sKSBzdGFuZGFyZCB3aXRoIG5vIHNwYWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3B0aW9uQ29udHJhY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhpcyBvcHRpb24gY29udHJhY3QuIEl0IGlzIG9uZSBvZjogIGBwdXRgOiBmb3IgUHV0IG9wdGlvbiBjb250cmFjdHMgIGBjYWxsYDogZm9yIENhbGwgb3B0aW9uIGNvbnRyYWN0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9wdGlvbkNvbnRyYWN0XG4gICAgICovXG4gICAgY29udHJhY3RfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaWtlIHByaWNlIGZvciB0aGlzIG9wdGlvbiBjb250cmFjdCwgcGVyIHNoYXJlIG9mIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE9wdGlvbkNvbnRyYWN0XG4gICAgICovXG4gICAgc3RyaWtlX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRpY2tlciBvZiB0aGUgdW5kZXJseWluZyBzZWN1cml0eSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICB1bmRlcmx5aW5nX3NlY3VyaXR5X3RpY2tlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yIGFuZCB0aGVpciBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9yaWdpbmF0b3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBPcmlnaW5hdG9y4oCZcyBjbGllbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpbGlnZW5jZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdHJhbnNmZXIgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3kge1xuICAgIE9uY2VQZXJNb250aCA9ICdvbmNlX3Blcl9tb250aCcsXG4gICAgVHdpY2VQZXJNb250aCA9ICd0d2ljZV9wZXJfbW9udGgnLFxuICAgIE9uY2VQZXJXZWVrID0gJ29uY2VfcGVyX3dlZWsnLFxuICAgIERhaWx5ID0gJ2RhaWx5J1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIG90aGVyIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtb3RoZXIpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3RoZXJBY2NvdW50U3VidHlwZSB7XG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYG90aGVyYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE90aGVyRmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxPdGhlckFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3RoZXJGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxPdGhlckFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQuICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYHBheXJvbGw6YCBQYXlyb2xsIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE92ZXJyaWRlQWNjb3VudFR5cGUge1xuICAgIEludmVzdG1lbnQgPSAnaW52ZXN0bWVudCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCcsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogRGF0YSB0byB1c2UgdG8gc2V0IHZhbHVlcyBvZiB0ZXN0IGFjY291bnRzLiBTb21lIHZhbHVlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYW5kIHdpbGwgaW5zdGVhZCB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBvdGhlciB0ZXN0IGRhdGEgaW4gb3JkZXIgdG8gYWNoaWV2ZSBtb3JlIGNvbnNpc3RlbnQsIHJlYWxpc3RpYyB0ZXN0IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3ZlcnJpZGVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHR5cGU6IE92ZXJyaWRlQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIHN0YXJ0IHdpdGggdGhpcyBhbW91bnQgYXMgdGhlIGN1cnJlbnQgYmFsYW5jZS4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBhbHdheXMgaGF2ZSB0aGlzIGFtb3VudCBhcyBpdHMgIGF2YWlsYWJsZSBiYWxhbmNlLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQgYmFsYW5jZSBvciBjaGFuZ2VzIGluIHRyYW5zYWN0aW9ucyBvdmVyIHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGZvcmNlX2F2YWlsYWJsZV9iYWxhbmNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSVNPLTQyMTcgY3VycmVuY3kgY29kZS4gSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgYmUgZGVub21pbmF0ZWQgaW4gdGhlIGdpdmVuIGN1cnJlbmN5LiBUcmFuc2FjdGlvbnMgd2lsbCBhbHNvIGJlIGluIHRoaXMgY3VycmVuY3kgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG1ldGE6IE1ldGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb25PdmVycmlkZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvbGRpbmdzT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IEhvbGRpbmdzT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpZGVudGl0eTogT3duZXJPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBsaWFiaWxpdHk6IExpYWJpbGl0eU92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmZsb3dNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGluZmxvd19tb2RlbDogSW5mbG93TW9kZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5jb21lPzogSW5jb21lT3ZlcnJpZGU7XG59XG4vKipcbiAqIERhdGEgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gT25seSB0aGUgYG5hbWVzYCBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJbiB0aGUgY2FzZSBvZiBhIGpvaW50IGFjY291bnQsIFBsYWlkIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHJlcG9ydCB0aGUgbmFtZXMgb2YgYWxsIGFjY291bnQgaG9sZGVycy4gIElmIGFuIEl0ZW0gY29udGFpbnMgbXVsdGlwbGUgYWNjb3VudHMgd2l0aCBkaWZmZXJlbnQgb3duZXIgbmFtZXMsIHNvbWUgaW5zdGl0dXRpb25zIHdpbGwgcmVwb3J0IGFsbCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaW4gZWFjaCBhY2NvdW50XFwncyBgbmFtZXNgIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbiAgICAvKipcbiAgICAgKiBkb2N1bWVudF9pZCBpcyB0aGUgaWQgb2YgdGhlIGRvY3VtZW50IHRoYXQgdGhpcyBpZGVudGl0eSBiZWxvbmdzIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBBbnkgZmllbGRzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBkZWZhdWx0IFNhbmRib3ggaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZXNlIHNob3VsZCBhbHdheXMgYmUgdGhlIG5hbWVzIG9mIGluZGl2aWR1YWxzLCBldmVuIGZvciBidXNpbmVzcyBhY2NvdW50cy4gTm90ZSB0aGF0IHRoZSBzYW1lIG5hbWUgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIGFsbCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGhvbmVOdW1iZXI+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxFbWFpbD59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbn1cbi8qKlxuICogSG93IGFuIGFzc2V0IGlzIG93bmVkLiAgYGFzc29jaWF0aW9uYDogT3duZXJzaGlwIGJ5IGEgY29ycG9yYXRpb24sIHBhcnRuZXJzaGlwLCBvciB1bmluY29ycG9yYXRlZCBhc3NvY2lhdGlvbiwgaW5jbHVkaW5nIGZvci1wcm9maXQgYW5kIG5vdC1mb3ItcHJvZml0IG9yZ2FuaXphdGlvbnMuIGBpbmRpdmlkdWFsYDogT3duZXJzaGlwIGJ5IGFuIGluZGl2aWR1YWwuIGBqb2ludGA6IEpvaW50IG93bmVyc2hpcCBieSBtdWx0aXBsZSBwYXJ0aWVzLiBgdHJ1c3RgOiBPd25lcnNoaXAgYnkgYSByZXZvY2FibGUgb3IgaXJyZXZvY2FibGUgdHJ1c3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPd25lcnNoaXBUeXBlIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEluZGl2aWR1YWwgPSAnaW5kaXZpZHVhbCcsXG4gICAgSm9pbnQgPSAnam9pbnQnLFxuICAgIEFzc29jaWF0aW9uID0gJ2Fzc29jaWF0aW9uJyxcbiAgICBUcnVzdCA9ICd0cnVzdCdcbn1cblxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBpcyBhIHBvc3Qgb2ZmaWNlIGJveC4gV2lsbCBiZSBgeWVzYCB3aGVuIGEgUC5PLiBib3ggaXMgZGV0ZWN0ZWQsIGBub2Agd2hlbiBQbGFpZCBjb25maXJtZWQgdGhlIGFkZHJlc3MgaXMgbm90IGEgUC5PLiBib3gsIGFuZCBgbm9fZGF0YWAgd2hlbiBQbGFpZCB3YXMgbm90IGFibGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhZGRyZXNzIGlzIGEgUC5PLiBib3guXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQT0JveFN0YXR1cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHVkZW50XFwncyBlbGlnaWJpbGl0eSBpbiB0aGUgUHVibGljIFNlcnZpY2UgTG9hbiBGb3JnaXZlbmVzcyBwcm9ncmFtLiBUaGlzIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIEZlZExvYW4gKGBpbnNfMTE2NTI3YCkuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQU0xGU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVzdGltYXRlZCBkYXRlIGJvcnJvd2VyIHdpbGwgaGF2ZSBjb21wbGV0ZWQgMTIwIHF1YWxpZnlpbmcgbW9udGhseSBwYXltZW50cy4gUmV0dXJuZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgZXN0aW1hdGVkX2VsaWdpYmlsaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUFNMRlN0YXR1c1xuICAgICAqL1xuICAgIHBheW1lbnRzX21hZGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHJlbWFpbmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfcmVtYWluaW5nOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlZmluZSBzcGVjaWZpYyBwYXJ0aWVzIHRvIGEgZGVhbC4gVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0IHBhcnRpY2lwYXRpbmcgcGFydGllcywgc3VjaCBhcyBib3Jyb3dlciBhbmQgc2VsbGVyIGFuZCB0aGUgaW5kaXJlY3QgcGFydGllcyBzdWNoIGFzIHRoZSBjcmVkaXQgcmVwb3J0IHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0aWVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxQYXJ0eT47XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlY2huaWNhbF9jb250YWN0PzogUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3R9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbWVyX3N1cHBvcnRfaW5mbz86IFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm87XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgcGFydG5lciBoYXMgZm9yd2FyZGVkIHRoZSBQbGFpZCBiYW5rIGFkZGVuZHVtIHRvIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19iYW5rX2FkZGVuZHVtX2NvbXBsZXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRzX3VuZGVyX21hbmFnZW1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFVSSXMgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24ocykgd2hlcmUgYSB1c2VyIGNhbiBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciB2aWEgYSB3ZWJ2aWV3LiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQsIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX3NlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IFBhcnRuZXJFbmRDdXN0b21lcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lciB0byBiZSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhbiBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbn1cbi8qKlxuICogVGhlIGVuZCBjdXN0b21lclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldHMgdW5kZXIgbWFuYWdlbWVudCBmb3IgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gUmVxdWlyZWQgZm9yIGVuZCBjdXN0b21lcnMgd2l0aCBtb250aGx5IHNlcnZpY2UgY29tbWl0bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGJpbGxpbmcgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgYmlsbGluZyBjb250YWN0IGlmIG9taXR0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGljLiBVc2VycyBvZiB5b3VyIGFwcCB3aWxsIHNlZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gbWFuYWdpbmcgY29ubmVjdGlvbnMgYmV0d2VlbiB5b3VyIGFwcCBhbmQgdGhlaXIgYmFuayBhY2NvdW50cyBpbiBQbGFpZCBQb3J0YWwuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGN1c3RvbWVyIHN1cHBvcnQgaW5mbyBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGNvbnRhY3RfdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBsaW5rX3VwZGF0ZV91cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGFkZGVuZHVtIHRvIHRoZSBQbGFpZCBNU0EgKFxcXCJmbG93ZG93blxcXCIpIGZvciB0aGUgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIEluUmV2aWV3ID0gJ0lOX1JFVklFVycsXG4gICAgTmVnb3RpYXRpb24gPSAnTkVHT1RJQVRJT04nLFxuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRoZSBPQXV0aCByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgZW52aXJvbm1lbnRzPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50cztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbiB3YXMgYXBwcm92ZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlaXIgYXBwbGljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBhcHByb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9lbmFibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIG5vbi1PQXV0aCBJdGVtIGFkZHMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGZvciB0aGlzIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gc3VjaCBkYXRlIGhhcyBiZWVuIHNldCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGNsYXNzaWNfZGlzYWJsZW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZWdpc3RyYXRpb24gc3RhdHVzIGZvciB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQUk9DRVNTSU5HJyxcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRW5hYmxlZCA9ICdFTkFCTEVEJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdBVFRFTlRJT05fUkVRVUlSRUQnXG59XG5cbi8qKlxuICogUmVnaXN0cmF0aW9uIHN0YXR1c2VzIGJ5IGVudmlyb25tZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICAgICAqL1xuICAgIGRldmVsb3BtZW50PzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgT0F1dGggc3RhdHVzIG9mIHRoZSB1cGRhdGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlcyB7XG4gICAgTm90U3RhcnRlZCA9ICdub3Qtc3RhcnRlZCcsXG4gICAgUHJvY2Vzc2luZyA9ICdwcm9jZXNzaW5nJyxcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRW5hYmxlZCA9ICdlbmFibGVkJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdhdHRlbnRpb24tcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgUEFSVE5FUmAgYW5kIGNvZGUgYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGAgd2lsbCBiZSBmaXJlZCB3aGVuIGEgcGFydG5lclxcJ3MgZW5kIGN1c3RvbWVyIGhhcyBhbiB1cGRhdGUgb24gdGhlaXIgT0F1dGggcmVnaXN0cmF0aW9uIHN0YXR1cyB3aXRoIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3VyaXR5IHF1ZXN0aW9ubmFpcmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBSZWNlaXZlZCA9ICdSRUNFSVZFRCcsXG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnXG59XG5cbi8qKlxuICogVGhlIHNlY3JldHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lciBpbiBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgc2FuZGJveD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIGRldmVsb3BtZW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuICBgVU5ERVJfUkVWSUVXYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBlbmFibGVkIGluIHRoZSBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gcHJvZHVjdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXRzIHN0YXR1cyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJhbnNpdGlvbiB0byBgUEVORElOR19FTkFCTEVNRU5UYCBvciBgREVOSUVEYC4gIGBQRU5ESU5HX0VOQUJMRU1FTlRgOiBUaGUgZW5kIGN1c3RvbWVyIGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIENhbGwgdGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IHRvIGVuYWJsZSB0aGUgZW5kIGN1c3RvbWVyIGluIFByb2R1Y3Rpb24uICBgQUNUSVZFYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBlbmFibGVkIGluIGFsbCBlbnZpcm9ubWVudHMuICBgREVOSUVEYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBlbmFibGVkIGluIHRoZSBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMsIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIFRhbGsgdG8geW91ciBBY2NvdW50IE1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgSU5ESVZJRFVBTDogUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUlM6IFRheHBheWVySWRlbnRpZmllcnM7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlJbmRpdmlkdWFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbE5hbWV9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IEluZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBkZWZpbmVkIGxpc3QgdGhhdCBpZGVudGlmaWVzIHRoZSByb2xlIHRoYXQgdGhlIHBhcnR5IHBsYXlzIGluIHRoZSB0cmFuc2FjdGlvbi4gUGFydGllcyBtYXkgYmUgZWl0aGVyIGEgcGVyc29uIG9yIGxlZ2FsIGVudGl0eS4gQSBwYXJ0eSBtYXkgcGxheSBtdWx0aXBsZSByb2xlcyBpbiBhIHRyYW5zYWN0aW9uLkEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0eVJvbGVUeXBlIHtcbiAgICBCb3Jyb3dlciA9ICdCb3Jyb3dlcidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbnVtZXJpY2FsIGFtb3VudCBvZiBhIHNwZWNpZmljIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVuY3kgY29kZSwgZS5nLiBVU0RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheUZyZXF1ZW5jeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeVZhbHVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2YWx1ZTogUGF5RnJlcXVlbmN5VmFsdWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5RnJlcXVlbmN5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5RnJlcXVlbmN5VmFsdWUge1xuICAgIE1vbnRobHkgPSAnbW9udGhseScsXG4gICAgU2VtaW1vbnRobHkgPSAnc2VtaW1vbnRobHknLFxuICAgIFdlZWtseSA9ICd3ZWVrbHknLFxuICAgIEJpd2Vla2x5ID0gJ2Jpd2Vla2x5JyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kge1xuICAgIFBheUZyZXF1ZW5jeVVua25vd24gPSAnUEFZX0ZSRVFVRU5DWV9VTktOT1dOJyxcbiAgICBQYXlGcmVxdWVuY3lXZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9XRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeUJpd2Vla2x5ID0gJ1BBWV9GUkVRVUVOQ1lfQklXRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeVNlbWltb250aGx5ID0gJ1BBWV9GUkVRVUVOQ1lfU0VNSU1PTlRITFknLFxuICAgIFBheUZyZXF1ZW5jeU1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSB0b3RhbCBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnRzIHRoYXQgdGhlIHBheW1lbnQgd2FzIGRpc3RyaWJ1dGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBob3VycyBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb3VybHkgcmF0ZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIHRoZSBlYXJuaW5ncyBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGhvdXJzIHdvcmtlZCBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN1cml0eS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBlbmRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9iYXNpcz86IENyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheSBwZXJpb2Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YlRheHBheWVySURcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRUb1JlZnVuZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENoYW5uZWwge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIE1heGltdW0gYW1vdW50IG9mIGEgc2luZ2xlIHBheW1lbnQgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBgQ0FMRU5EQVJgOiBsaW5lIHVwIHdpdGggYSBjYWxlbmRhci4gIGBDT05TRU5UYDogb24gdGhlIGRhdGUgb2YgY29uc2VudCBjcmVhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnQge1xuICAgIENhbGVuZGFyID0gJ0NBTEVOREFSJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogRGVmaW5lcyBjb25zZW50IHBheW1lbnRzIGxpbWl0YXRpb25zIHBlciBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgcGVyaW9kaWMgaW50ZXJ2YWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWwge1xuICAgIERheSA9ICdEQVknLFxuICAgIFdlZWsgPSAnV0VFSycsXG4gICAgTW9udGggPSAnTU9OVEgnLFxuICAgIFllYXIgPSAnWUVBUidcbn1cblxuLyoqXG4gKiBMaWZlIHNwYW4gZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIEFmdGVyIHRoZSBgdG9gIGRhdGUgdGhlIHBheW1lbnQgY29uc2VudCBleHBpcmVzIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGZyb20gd2hpY2ggdGhlIGNvbnNlbnQgc2hvdWxkIGJlIGFjdGl2ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIGZyb20/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBjb25zZW50IGV4cGlyZXMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWVcbiAgICAgKi9cbiAgICB0bz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBvcHRpb25hbCBhZGRyZXNzIG9mIHRoZSBwYXltZW50IHJlY2lwaWVudFxcJ3MgYmFuayBhY2NvdW50LiBSZXF1aXJlZCBieSBtb3N0IGluc3RpdHV0aW9ucyBvdXRzaWRlIG9mIHRoZSBVSy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBsZW5ndGggMS0yIHJlcHJlc2VudGluZyB0aGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDcwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgMzUgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAxNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ29uc2VudCBjcmVhdGlvbiB0aW1lc3RhbXAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCBjb25zZW50IHNjb3Blcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50VmFsaWREYXRlVGltZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICB2YWxpZF9kYXRlX3RpbWU/OiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgbWF4X3BheW1lbnRfYW1vdW50OiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFtb3VudCBsaW1pdGF0aW9ucyBwZXIgcGVyaW9kIG9mIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIHBlcmlvZGljX2Ftb3VudHM6IEFycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+O1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLiBUaGUgY3JlYXRlZCBjb25zZW50IGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIGZ1bmRzIHRvIHRoaXMgcmVjaXBpZW50IG9ubHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBUaGlzIG11c3QgYmUgYW4gYWxwaGFudW1lcmljIHN0cmluZyB3aXRoIGF0IG1vc3QgMTggY2hhcmFjdGVycyBhbmQgbXVzdCBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IGNvbnNlbnQgc2NvcGVzLlxuICAgICAqIEB0eXBlIHtTZXQ8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NvcGVzOiBTZXQ8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGNvbnNlbnQgcGF5bWVudC4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gSWYgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgYSBjb25zZW50IHBheW1lbnQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcGF5bWVudCBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSBwYXltZW50IHRoYXQgdXNlcyB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXksIGFuZCB3YXMgcmVjZWl2ZWQgd2l0aGluIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCByZXF1ZXN0LCBmcm9tIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnQgY29uc2VudCBzY29wZS4gRGVmaW5lcyBwb3NzaWJsZSBkaXJlY3Rpb25zIGZvciBwYXltZW50cyBtYWRlIHdpdGggdGhlIGdpdmVuIGNvbnNlbnQuICBgTUVfVE9fTUVgOiBBbGxvd3MgbW92aW5nIG1vbmV5IGJldHdlZW4gYWNjb3VudHMgb3duZWQgYnkgdGhlIHNhbWUgdXNlci4gIGBFWFRFUk5BTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlIHtcbiAgICBNZVRvTWUgPSAnTUVfVE9fTUUnLFxuICAgIEV4dGVybmFsID0gJ0VYVEVSTkFMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQgY29uc2VudC4gIGBVTkFVVEhPUklTRURgOiBDb25zZW50IGNyZWF0ZWQsIGJ1dCByZXF1aXJlcyB1c2VyIGF1dGhvcmlzYXRpb24uICBgUkVKRUNURURgOiBDb25zZW50IGF1dGhvcmlzYXRpb24gd2FzIHJlamVjdGVkIGJ5IHRoZSB1c2VyIGFuZC9vciB0aGUgYmFuay4gIGBBVVRIT1JJU0VEYDogQ29uc2VudCBpcyBhY3RpdmUgYW5kIHJlYWR5IHRvIGJlIHVzZWQuICBgUkVWT0tFRGA6IENvbnNlbnQgaGFzIGJlZW4gcmV2b2tlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiAgYEVYUElSRURgOiBDb25zZW50IGlzIG5vIGxvbmdlciB2YWxpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cyB7XG4gICAgVW5hdXRob3Jpc2VkID0gJ1VOQVVUSE9SSVNFRCcsXG4gICAgQXV0aG9yaXNlZCA9ICdBVVRIT1JJU0VEJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIFJlamVjdGVkID0gJ1JFSkVDVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHVzZWQgdG8gcmVzdHJpY3QgdGhlIGFjY291bnRzIHVzZWQgZm9yIHBheW1lbnRzLiBJZiBwcm92aWRlZCwgdGhlIGVuZCB1c2VyIHdpbGwgYmUgYWJsZSB0byBzZW5kIHBheW1lbnRzIG9ubHkgZnJvbSB0aGUgc3BlY2lmaWVkIGJhbmsgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmVmdW5kIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgcGF5bWVudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9kZXRhaWxzPzogRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbmRlckJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRSZWZ1bmRlZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXltZW50cyB0byByZXR1cm4uIElmIGBjb3VudGAgaXMgbm90IHNwZWNpZmllZCwgYSBtYXhpbXVtIG9mIDEwIHBheW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQsIGJlZ2lubmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBwYXltZW50IGJlZm9yZSB0aGUgY3Vyc29yIChpZiBzcGVjaWZpZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBcXFwiMjAxOS0xMi0wNlQyMjozNTo0OVpcXFwiKS4gT25seSBwYXltZW50cyBjcmVhdGVkIGJlZm9yZSB0aGUgY3Vyc29yIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELiBJZiBzcGVjaWZpZWQsIG9ubHkgcGF5bWVudHMsIGV4ZWN1dGVkIHVzaW5nIHRoaXMgY29uc2VudCwgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD47XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoYXQsIHdoZW4gdXNlZCBhcyB0aGUgb3B0aW9uYWwgYGN1cnNvcmAgcGFyYW1ldGVyIHRvIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBuZXh0IHVucmV0dXJuZWQgcGF5bWVudCBhcyBpdHMgZmlyc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudCB0byByZXZlcnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSByZWZ1bmQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRUb1JlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQYXltZW50QW1vdW50VG9SZWZ1bmQ7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWZ1bmRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIGFsbCBwYXltZW50cy4gSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHBheW1lbnQgaXMgd2FpdGluZyBvbiB1c2VyIGlucHV0IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEEgcGF5bWVudCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBsYXRlciBvbiBpZiBmdXJ0aGVyIGlucHV0IGlzIG5lZWRlZC4gIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYXV0aG9yaXNlZCBhbmQgYWNjZXB0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIHN1Y2Nlc3NmdWwgcGF5bWVudHMsIHRoaXMgaXMgYSBwb3RlbnRpYWwgdGVybWluYWwgc3RhdHVzLiBGdXJ0aGVyIHN0YXR1cyB0cmFuc2l0aW9ucyBjYW4gYmUgdG8gUkVKRUNURUQgYW5kLCB3aGVuIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24sIHRvIEVYRUNVVEVELiAgYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2A6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIHRvIGJlIGluaXRpYXRlZC4gVGhpcyBlcnJvciBtYXkgYmUgY2F1c2VkIGJ5IHRyYW5zaWVudCBzeXN0ZW0gb3V0YWdlcyBhbmQgaXMgcmV0cnlhYmxlIG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICBgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIGJsb2NrZWQgYnkgUGxhaWQuIFRoaXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgZHVlIHRvIFBsYWlkIGZsYWdnaW5nIHRoZSBwYXltZW50IGFzIHBvdGVudGlhbGx5IHJpc2t5LiBUaGlzIGlzIGEgcmV0cnlhYmxlIGVycm9yLiAgYFBBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaGFzIGF1dGhvcmlzZWQgdGhlIHRyYW5zYWN0aW9uLiAgYFBBWU1FTlRfU1RBVFVTX0NBTkNFTExFRGA6IFRoZSBwYXltZW50IHdhcyBjYW5jZWxsZWQgKHR5cGljYWxseSBieSB0aGUgZW5kIHVzZXIpIGR1cmluZyBhdXRob3Jpc2F0aW9uLiAgYFBBWU1FTlRfU1RBVFVTX0VYRUNVVEVEYDogVGhlIGZ1bmRzIGhhdmUgc3VjY2Vzc2Z1bGx5IGxlZnQgdGhlIHBheWVyIGFjY291bnQgYW5kIHBheW1lbnQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gTm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGlzIHN0YXR1czogc3VwcG9ydCBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgVUssIGFuZCBsZXNzIGNvbW1vbiBpbiB0aGUgRVUuIEZvciBpbnN0aXR1dGlvbnMgd2hlcmUgdGhpcyBzdGF0dXMgaXMgbm90IHN1cHBvcnRlZCwgdGhlIHRlcm1pbmFsIHN0YXR1cyBmb3IgYSBzdWNjZXNzZnVsIHBheW1lbnQgd2lsbCBiZSBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYC4gIGBQQVlNRU5UX1NUQVRVU19TRVRUTEVEYDogVGhlIHBheW1lbnQgaGFzIHNldHRsZWQgYW5kIGZ1bmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZS4gQSBwYXltZW50IHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gVGhpcyBzdGF0dXMgaXMgb25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIHVzaW5nIFtQbGFpZCBWaXJ0dWFsIEFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3ZpcnR1YWwtYWNjb3VudHMvKS4gIGBQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuICBgUEFZTUVOVF9TVEFUVVNfUkVKRUNURURgOiBUaGUgcGF5bWVudCB3YXMgcmVqZWN0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIERlcHJlY2F0ZWQ6IFRoZXNlIHN0YXR1c2VzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAgYFBBWU1FTlRfU1RBVFVTX1VOS05PV05gOiBUaGUgcGF5bWVudCBzdGF0dXMgaXMgdW5rbm93bi4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cyB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nLFxuICAgIEV4ZWN1dGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1BBWU1FTlRfU1RBVFVTX1NFVFRMRUQnLFxuICAgIEF1dGhvcmlzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HJyxcbiAgICBDYW5jZWxsZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEJyxcbiAgICBFc3RhYmxpc2hlZCA9ICdQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfUkVKRUNURUQnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYHBheW1lbnRfdG9rZW5gIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgdGhlIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgdG9rZW4gd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgcGF5bWVudF90b2tlbmAgZXhwaXJlcyBhZnRlciAxNSBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHJlY2lwaWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC4gV2UgcmVjb21tZW5kIHVzaW5nIHN0cmluZ3Mgb2YgbGVuZ3RoIDE4IG9yIGxlc3MgYW5kIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVycyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LiBJZiBCQUNTIGRhdGEgaXMgbm90IHByb3ZpZGVkLCBhbiBJQkFOIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCByZWNpcGllbnRzIGNyZWF0ZWQgZm9yIFBheW1lbnQgSW5pdGlhdGlvblxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdmFsaWQgUGF5bWVudCBJbml0aWF0aW9uIHN0YW5kaW5nIG9yZGVyIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBjbG9zZWQtZW5kZWQgc3RhbmRpbmcgb3JkZXJzIGJ5IHByb3ZpZGluZyBhbiBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19zdGFuZGluZ19vcmRlcl9lbmRfZGF0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXJzLiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgbmVnYXRpdmUgaW50ZWdlcnMgKC0xIHRvIC01KSBmb3Igc2V0dGluZyB1cCBhIGBNT05USExZYCBzdGFuZGluZyBvcmRlciByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19zdGFuZGluZ19vcmRlcl9uZWdhdGl2ZV9leGVjdXRpb25fZGF5czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIHZhbGlkIHN0YW5kaW5nIG9yZGVyIGludGVydmFscyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50U2NoZWR1bGVJbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgdmFsaWRfc3RhbmRpbmdfb3JkZXJfaW50ZXJ2YWxzOiBBcnJheTxQYXltZW50U2NoZWR1bGVJbnRlcnZhbD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGludGVyLWJhbmsgdHJhbnNmZXJzLiBJZiB0aGUgdHJhbnNhY3Rpb24gd2FzIG5vdCBhbiBpbnRlci1iYW5rIHRyYW5zZmVyLCBhbGwgZmllbGRzIHdpbGwgYmUgYG51bGxgLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGUgYHBheW1lbnRfbWV0YWAga2V5IHdpbGwgYWx3YXlzIGFwcGVhciwgYnV0IG5vIGRhdGEgZWxlbWVudHMgYXJlIGd1YXJhbnRlZWQuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRNZXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50TWV0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiByZWZlcmVuY2UgbnVtYmVyIHN1cHBsaWVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICByZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggUFBEIElEIGZvciB0aGUgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwcGRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcmVjZWl2aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0eSBpbml0aWF0aW5nIGEgd2lyZSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhIHdpcmUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBieV9vcmRlcl9vZjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyBwYXlpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdHJhbnNmZXIsIGUuZy4gXFwnQUNIXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5bWVudCBwcm9jZXNzb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvY2Vzc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXllci1zdXBwbGllZCBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICByZWFzb246IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiAgYFJFQURZYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaXMgcmVhZHkgdG8gYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuICBgUEVORElOR2A6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIG5vdCByZWFkeSB0byBiZSB1c2VkLiBZb3XigJlsbCBuZWVkIHRvIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZCB0byBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UuICBgUkVNT1ZFRGA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50UHJvZmlsZVN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBSZWFkeSA9ICdSRUFEWScsXG4gICAgUmVtb3ZlZCA9ICdSRU1PVkVEJ1xufVxuXG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgaW50ZXJ2YWwgb2YgdGhlIHBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50U2NoZWR1bGVJbnRlcnZhbCB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFBheW1lbnQgc2NoZW1lLiBJZiBub3Qgc3BlY2lmaWVkIC0gdGhlIGRlZmF1bHQgaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHVzZWQgKGUuZy4gYFNFUEFfQ1JFRElUX1RSQU5TRkVSYCBmb3IgRVUpLiBVc2luZyB1bnN1cHBvcnRlZCB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gYSBmYWlsZWQgcGF5bWVudC4gIGBMT0NBTF9ERUZBVUxUYDogVGhlIGRlZmF1bHQgcGF5bWVudCBzY2hlbWUgZm9yIHRoZSBzZWxlY3RlZCBtYXJrZXQgYW5kIGN1cnJlbmN5IHdpbGwgYmUgdXNlZC4gIGBMT0NBTF9JTlNUQU5UYDogVGhlIGluc3RhbnQgcGF5bWVudCBzY2hlbWUgZm9yIHRoZSBzZWxlY3RlZCBtYXJrZXQgYW5kIGN1cnJlbmN5IHdpbGwgYmUgdXNlZCAoaWYgYXBwbGljYWJsZSkuIEZlZXMgbWF5IGJlIGFwcGxpZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJZiB0aGUgbWFya2V0IGRvZXMgbm90IHN1cHBvcnQgYW4gSW5zdGFudCBTY2hlbWUgKGUuZy4gRGVubWFyayksIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHdpdGhpbiB0aGUgU0VQQSBhcmVhLiBNYXkgaW52b2x2ZSBhZGRpdGlvbmFsIGZlZXMgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIGF0IHNvbWUgYmFua3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIExvY2FsRGVmYXVsdCA9ICdMT0NBTF9ERUZBVUxUJyxcbiAgICBMb2NhbEluc3RhbnQgPSAnTE9DQUxfSU5TVEFOVCcsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBoYXMgY2hhbmdlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfSU5JVElBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIGZvciB0aGUgcGF5bWVudCBiZWluZyB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHdoZW4gY3JlYXRpbmcgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9yZWZlcmVuY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGBzdGFydF9kYXRlYCBwcm92aWRlZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3RhbmRpbmcgb3JkZXIuIElmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCBvciBpZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGFjY291bnQgbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXJvbGxJbmNvbWVSYXRlT2ZQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHJhdGVfb2ZfcGF5OiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5O1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgcGF5cm9sbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXkgc3R1YnMgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRQYXlTdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIHBheV9zdHViczogQXJyYXk8Q3JlZGl0UGF5U3R1Yj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gVy0ycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0VzI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgdzJzOiBBcnJheTxDcmVkaXRXMj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gMTA5OXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdDEwOTk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgZm9ybTEwOTlzOiBBcnJheTxDcmVkaXQxMDk5Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmF0ZSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmF0ZSBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfcmF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lOiBBcnJheTxQYXlyb2xsSW5jb21lT2JqZWN0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEl0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXlyb2xsSXRlbVN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBJdGVtIHdhcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERlbm90ZXMgdGhlIHByb2Nlc3Npbmcgc3RhdHVzIGZvciB0aGUgdmVyaWZpY2F0aW9uLiAgYFVOS05PV05gOiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgYW5kIHRoZSB1c2VyIGhhcyBhcHByb3ZlZCBmb3Igc2hhcmluZy4gVGhlIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlIHJldHJpZXZlZC4gIGBQUk9DRVNTSU5HYDogVGhlIHZlcmlmaWNhdGlvbiBpcyBzdGlsbCBwcm9jZXNzaW5nLiBUaGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHlldC4gIGBGQUlMRURgOiBUaGUgcHJvY2Vzc2luZyBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiAgYEFQUFJPVkFMX1NUQVRVU19QRU5ESU5HYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBidXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgYXBwcm92ZWQgdGhlIHNoYXJpbmcgb2YgdGhlIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBwcm9jZXNzaW5nX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBJdGVtIGxpbmtlZCBhcyBwYXJ0IG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGluY29tZSBkb2N1bWVudCBhdXRoZW50aWNpdHkgZGF0YSByZXRyaWV2ZWQgZm9yIGVhY2ggb2YgdGhlIHVzZXJcXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIGVuZCB1c2VyXFwncyBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkb2NfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50RGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1wbG95bWVudF9kZXRhaWxzPzogRW1wbG95bWVudERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IE5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5UGVyaW9kRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheXN0dWJfZGV0YWlscz86IFBheXN0dWJEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YllURERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9lYXJuaW5ncz86IFBheXN0dWJZVEREZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUxPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0ZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVkdWN0aW9uIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiwgYXMgcHJvdmlkZWQgb24gdGhlIHBheXN0dWIuIEZvciBleGFtcGxlOiBgXFxcIjQwMShrKVxcXCJgLCBgXFxcIkZJQ0EgTUVEIFRBWFxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVkdWN0aW9uIGlzIHByZS10YXg7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgaXNfcHJldGF4OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRldGFpbHMgdGhhdCBjYW4gYmUgZm91bmQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEJlZ2lubmluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2Rfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9lbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGF5IGRhdGUgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgZ2VuZXJhdGVkIHRoZSBwYXlzdHViLCBlLmcuIEFEUFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5c3R1Yl9wcm92aWRlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheXN0dWJQYXlGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkYXRhIGZyb20gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgaW5jb21lX2JyZWFrZG93bj86IEFycmF5PEluY29tZUJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlscz86IFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZWUgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3M7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBlbXBsb3llZSBpcyBwYWlkLiBQb3NzaWJsZSB2YWx1ZXM6IGBNT05USExZYCwgYEJJLVdFRUtMWWAsIGBXRUVLTFlgLCBgU0VNSS1NT05USExZYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheXN0dWJQYXlGcmVxdWVuY3kge1xuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQmlXZWVrbHkgPSAnQkktV0VFS0xZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JLU1PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIGluY29tZSBlYXJuZWQgeWVhciB0byBkYXRlLCBhcyBiYXNlZCBvbiBwYXlzdHViIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBncm9zcyBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgbmV0ICh0YWtlIGhvbWUpIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgbmV0X2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVt4oCZcyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFNvbWUgSXRlbXMgaGF2ZSBleHBsaWNpdCBleHBpcmF0aW9uIHRpbWVzIGFuZCB3ZSB0cnkgdG8gcmVsYXkgdGhpcyB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBzZXJ2aWNlIGRpc3J1cHRpb24uIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgcGVyc29uYWwgZmluYW5jZSB1c2UgY2FzZXMsIGJ1dCBub3QgbGltaXRlZCB0byBzdWNoIHVzZSBjYXNlcy4gIFNlZSB0aGUgW2B0YXhvbm9teSBDU1YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIElmIHlvdSBhcmUgbWlncmF0aW5nIHRvIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBmcm9tIHRoZSBsZWdhY3kgY2F0ZWdvcmllcywgYWxzbyByZWZlciB0byB0aGUgW2BtaWdyYXRpb24gZ3VpZGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9wZmMtbWlncmF0aW9uLykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNhdGVnb3JpZXMgYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LiAgYFZFUllfSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBMT1dgOiBUaGlzIGNhdGVnb3J5IG1heSByZWZsZWN0IHRoZSBpbnRlbnQsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgY2F0ZWdvcmllcyB0aGF0IGFyZSBtb3JlIGFjY3VyYXRlLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHBob25lIG51bWJlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBwaG9uZSBudW1iZXIgYXMgdGhlIHByaW1hcnkgbnVtYmVyIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBQaG9uZU51bWJlclR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBob25lTnVtYmVyVHlwZUVudW0ge1xuICAgIEhvbWUgPSAnaG9tZScsXG4gICAgV29yayA9ICd3b3JrJyxcbiAgICBPZmZpY2UgPSAnb2ZmaWNlJyxcbiAgICBNb2JpbGUgPSAnbW9iaWxlJyxcbiAgICBNb2JpbGUxID0gJ21vYmlsZTEnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIHBob25lIG51bWJlciBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIHBob25lIG51bWJlciBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIHBob25lIG51bWJlci4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBwaG9uZSBudW1iZXIgd2l0aCBleHRlbnNpb24gYWdhaW5zdCBvbmUgd2l0aG91dCBleHRlbnNpb24sIGV0Yy4pLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgcGhvbmUgbnVtYmVyIGlzIGEgcGhvbmUgbGluZSBvciBhIGZheCBsaW5lLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGhvbmVUeXBlIHtcbiAgICBQaG9uZSA9ICdwaG9uZScsXG4gICAgRmF4ID0gJ2ZheCdcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpZGVudGl0eSBkb2N1bWVudCBkZXRlY3RlZCBpbiB0aGUgaW1hZ2VzIHByb3ZpZGVkLiBXaWxsIGFsd2F5cyBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBkcml2ZXJcXCdzIGxpY2Vuc2UgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnksIGVzdGFibGlzaGluZyBpZGVudGl0eSB3aXRob3V0IGFueSBndWFyYW50ZWUgYXMgdG8gY2l0aXplbnNoaXAsIGFuZCBncmFudGluZyBkcml2aW5nIHByaXZpbGVnZXMgICAgYGlkX2NhcmRgIC0gQSBnZW5lcmFsIG5hdGlvbmFsIGlkZW50aWZpY2F0aW9uIGNhcmQsIGRpc3RpbmN0IGZyb20gZHJpdmVyXFwncyBsaWNlbnNlcyBhcyBpdCBvbmx5IGVzdGFibGlzaGVzIGlkZW50aXR5ICAgIGBwYXNzcG9ydGAgLSBBIHRyYXZlbCBwYXNzcG9ydCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBmb3Igb25lIG9mIGl0cyBjaXRpemVucyAgICBgcmVzaWRlbmNlX3Blcm1pdF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnRlbXBvcmFyaWx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGByZXNpZGVudF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnBlcm1hbmVudGx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGB2aXNhYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gZW50cnkgZm9yIGEgc2hvcnQgZHVyYXRpb24gYW5kIGZvciBhIHNwZWNpZmljIHB1cnBvc2UsIHR5cGljYWxseSBubyBsb25nZXIgdGhhbiA2IG1vbnRocyAgTm90ZTogVGhpcyB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIElEIHR5cGUgdGhhdCB0aGUgdXNlciBzZWxlY3RzIHdpdGhpbiBMaW5rLiBGb3IgZXhhbXBsZSwgaWYgdGhleSBzZWxlY3QgXFxcIkRyaXZlclxcJ3MgTGljZW5zZVxcXCIgYnV0IHRoZW4gc3VibWl0IGEgcGljdHVyZSBvZiBhIHBhc3Nwb3J0LCB0aGlzIGZpZWxkIHdpbGwgc2F5IGBwYXNzcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeSB7XG4gICAgRHJpdmVyc0xpY2Vuc2UgPSAnZHJpdmVyc19saWNlbnNlJyxcbiAgICBJZENhcmQgPSAnaWRfY2FyZCcsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFJlc2lkZW5jZVBlcm1pdENhcmQgPSAncmVzaWRlbmNlX3Blcm1pdF9jYXJkJyxcbiAgICBSZXNpZGVudENhcmQgPSAncmVzaWRlbnRfY2FyZCcsXG4gICAgVmlzYSA9ICd2aXNhJ1xufVxuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSB1c2VyLXN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQWxwaGEtbnVtZXJpYyBJRCBudW1iZXIgZXh0cmFjdGVkIHZpYSBPQ1IgZnJvbSB0aGUgdXNlclxcJ3MgZG9jdW1lbnQgaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogUGh5c2ljYWxEb2N1bWVudENhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19jb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpc3N1aW5nX3JlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogQW5hbHlzaXMgb2YgdGhlIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudE5hbWVNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBEb2N1bWVudE5hbWVNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBpcmF0aW9uRGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogRXhwaXJhdGlvbkRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3VpbmdDb3VudHJ5fVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgaXNzdWluZ19jb3VudHJ5OiBJc3N1aW5nQ291bnRyeTtcbn1cbi8qKlxuICogVVJMcyBmb3IgZG93bmxvYWRpbmcgb3JpZ2luYWwgYW5kIGNyb3BwZWQgaW1hZ2VzIGZvciB0aGlzIGRvY3VtZW50IHN1Ym1pc3Npb24uIFRoZSBVUkxzIGFyZSBkZXNpZ25lZCB0byBvbmx5IGFsbG93IGRvd25sb2FkaW5nLCBub3QgaG90IGxpbmtpbmcsIHNvIHRoZSBVUkwgd2lsbCBvbmx5IHNlcnZlIHRoZSBkb2N1bWVudCBpbWFnZSBmb3IgNjAgc2Vjb25kcyBiZWZvcmUgZXhwaXJpbmcuIFRoZSBleHBpcmF0aW9uIHRpbWUgaXMgNjAgc2Vjb25kcyBhZnRlciB0aGUgYEdFVGAgcmVxdWVzdCBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuIEEgbmV3IGV4cGlyaW5nIFVSTCBpcyBnZW5lcmF0ZWQgd2l0aCBlYWNoIHJlcXVlc3QsIHNvIHlvdSBjYW4gYWx3YXlzIHJlcmVxdWVzdCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaWYgb25lIG9mIHlvdXIgVVJMcyBleHBpcmVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIHVuY3JvcHBlZCBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9mcm9udDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyB0aGUgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfYmFjazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3BwZWQgaW1hZ2UgY29udGFpbmluZyBqdXN0IHRoZSBmcm9udCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGNyb3BwZWRfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50IHdhcyBub3QgY29sbGVjdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wIG9mIGp1c3QgdGhlIHVzZXJcXCdzIGZhY2UgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYSBmYWNlIHBob3RvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBmYWNlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGxhaWRFcnJvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uICBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgQXNzZXRzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGxhaWRFcnJvclR5cGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ0lOVkFMSURfUkVRVUVTVCcsXG4gICAgSW52YWxpZFJlc3VsdCA9ICdJTlZBTElEX1JFU1VMVCcsXG4gICAgSW52YWxpZElucHV0ID0gJ0lOVkFMSURfSU5QVVQnLFxuICAgIEluc3RpdHV0aW9uRXJyb3IgPSAnSU5TVElUVVRJT05fRVJST1InLFxuICAgIFJhdGVMaW1pdEV4Y2VlZGVkID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgIEFwaUVycm9yID0gJ0FQSV9FUlJPUicsXG4gICAgSXRlbUVycm9yID0gJ0lURU1fRVJST1InLFxuICAgIEFzc2V0UmVwb3J0RXJyb3IgPSAnQVNTRVRfUkVQT1JUX0VSUk9SJyxcbiAgICBSZWNhcHRjaGFFcnJvciA9ICdSRUNBUFRDSEFfRVJST1InLFxuICAgIE9hdXRoRXJyb3IgPSAnT0FVVEhfRVJST1InLFxuICAgIFBheW1lbnRFcnJvciA9ICdQQVlNRU5UX0VSUk9SJyxcbiAgICBCYW5rVHJhbnNmZXJFcnJvciA9ICdCQU5LX1RSQU5TRkVSX0VSUk9SJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FcnJvciA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX0VSUk9SJyxcbiAgICBNaWNyb2RlcG9zaXRzRXJyb3IgPSAnTUlDUk9ERVBPU0lUU19FUlJPUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQbGF0Zm9ybUlkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1JZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIGVtcGxveWVlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBvc2l0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JOdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFByb2Nlc3Nvck51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudGAuIFRoZSBpZGVudGlmeWluZyBudW1iZXIgdHlwZSAoQUNILCBFRlQsIElCQU4sIG9yIEJBQ1MpIHVzZWQgd2lsbCBkZXBlbmQgb24gdGhlIGNvdW50cnkgb2YgdGhlIGFjY291bnQuIEFuIGFjY291bnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBudW1iZXIgdHlwZS4gSWYgYSBwYXJ0aWN1bGFyIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIGlzIG5vdCB1c2VkIGJ5IHRoZSBgYWNjb3VudGAgZm9yIHdoaWNoIGF1dGggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQUNITnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGFjaD86IE51bWJlcnNBQ0hOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNFRlROdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgZWZ0PzogTnVtYmVyc0VGVE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBiYWNzPzogTnVtYmVyc0JBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgaXMgdXBkYXRlZC4gVGhpcyBpbmNsdWRlcyB3aGVuIGEgbmV3IHJlY3VycmluZyBzdHJlYW0gaXMgZGV0ZWN0ZWQgb3Igd2hlbiBhIG5ldyB0cmFuc2FjdGlvbiBpcyBhZGRlZCB0byBhbiBleGlzdGluZyByZWN1cnJpbmcgc3RyZWFtLiBUaGUgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYCB3ZWJob29rIHdpbGwgYWxzbyBmaXJlIHdoZW4gb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvZiB0aGUgcmVjdXJyaW5nIHN0cmVhbSBjaGFuZ2VzLCB3aGljaCBpcyB1c3VhbGx5IGEgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiwgdXBkYXRlLCBvciByZW1vdmFsIG9mIHRyYW5zYWN0aW9ucyB0byB0aGUgc3RyZWFtLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSB1cGRhdGVkIGRhdGEgY2FuIGJlIGZldGNoZWQgZnJvbSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIElEL2lkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZW5kIHVzZXIgaXMgcHJlc2VudCB3aGlsZSBpbml0aWF0aW5nIHRoZSBBQ0ggdHJhbnNmZXIgYW5kIHRoZSBlbmRwb2ludCBpcyBiZWluZyBjYWxsZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgQUNIIHRyYW5zZmVyIGlzIHNjaGVkdWxlZCBhbmQgdGhlIGVuZCB1c2VyIGlzIG5vdCBwcmVzZW50LCBvciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHRoZSBBQ0ggdHJhbnNmZXIgYnV0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBOYWNoYSBmaWxlIGZvciBBQ0ggcHJvY2Vzc2luZykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgSXRlbXMuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogKip0cnVlKiogaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgKipmYWxzZSoqIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsU2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmVzOiBTaWduYWxTY29yZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIHRyYW5zYWN0aW9ucyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIER3b2xsYSA9ICdkd29sbGEnLFxuICAgIEdhbGlsZW8gPSAnZ2FsaWxlbycsXG4gICAgTW9kZXJuVHJlYXN1cnkgPSAnbW9kZXJuX3RyZWFzdXJ5JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFByaW1lVHJ1c3QgPSAncHJpbWVfdHJ1c3QnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFd5cmUgPSAnd3lyZScsXG4gICAgTGl0aGljID0gJ2xpdGhpYycsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgTWFycWV0YSA9ICdtYXJxZXRhJyxcbiAgICBDaGVja291dCA9ICdjaGVja291dCcsXG4gICAgU29saWQgPSAnc29saWQnLFxuICAgIEhpZ2hub3RlID0gJ2hpZ2hub3RlJyxcbiAgICBHZW1pbmkgPSAnZ2VtaW5pJyxcbiAgICBBcGV4Q2xlYXJpbmcgPSAnYXBleF9jbGVhcmluZycsXG4gICAgR3VzdG8gPSAnZ3VzdG8nLFxuICAgIEFkeWVuID0gJ2FkeWVuJyxcbiAgICBBdG9taWMgPSAnYXRvbWljJyxcbiAgICBJMmMgPSAnaTJjJyxcbiAgICBXZXBheSA9ICd3ZXBheScsXG4gICAgUmlza2lmaWVkID0gJ3Jpc2tpZmllZCcsXG4gICAgVXRiID0gJ3V0YicsXG4gICAgQWRwUm9sbCA9ICdhZHBfcm9sbCcsXG4gICAgRm9ydHJlc3NUcnVzdCA9ICdmb3J0cmVzc190cnVzdCcsXG4gICAgQm9uZCA9ICdib25kJyxcbiAgICBCYWtrdCA9ICdiYWtrdCcsXG4gICAgVGVhbCA9ICd0ZWFsJyxcbiAgICBaZXJvSGFzaCA9ICd6ZXJvX2hhc2gnLFxuICAgIFRhYmFQYXkgPSAndGFiYV9wYXknLFxuICAgIEtub3QgPSAna25vdCcsXG4gICAgU2FyZGluZSA9ICdzYXJkaW5lJyxcbiAgICBBbGxveSA9ICdhbGxveSdcbn1cblxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYCBhbmQgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9jZXNzb3JfdG9rZW5gIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBieSB0aGUgUGxhaWQgcGFydG5lciB0byBtYWtlIEFQSSByZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGluY2x1ZGluZyBmdXR1cmUgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3Qgd2lsbCBncmFudCBhY2Nlc3MgdG8gYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhIHByb2Nlc3NvciB1cGRhdGVzIHRoZSB3ZWJob29rIFVSTCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4gdmlhIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgUFJPQ0VTU09SX1RPS0VOYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRvIHJlbW92ZSBhIHdlYmhvb2sgZnJvbSBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IHRvIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciwgb3Igc3VibWl0IGEgW1N1cHBvcnQgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3Byb2R1Y3QtZnVuY3Rpb25hbGl0eSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkZXBvc2l0b3J5IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU19SRU1PVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgdHJhbnNhY3Rpb25faWRzYCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlbW92ZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgaXRlbS4gTm90ZTogVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIG9uIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS4gVGhlIGN1cnNvciBvYnRhaW5lZCBhZnRlciBhbGwgcGFnZXMgaGF2ZSBiZWVuIHB1bGxlZCAoaW5kaWNhdGVkIGJ5IGBoYXNfbW9yZWAgYmVpbmcgYGZhbHNlYCkgd2lsbCBiZSB2YWxpZCBmb3IgYXQgbGVhc3QgMSB5ZWFyLiBUaGlzIGN1cnNvciBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciBsYXRlciBjYWxscy4gSWYgdHJhbnNhY3Rpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcHJvZHVjdCBhY2Nlc3MgYmVpbmcgcmVxdWVzdGVkLiBVc2VkIHRvIG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGFjcm9zcyBhbGwgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBhbGwgcHJvZHVjdHMgYWxsb3dlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdEFjY2Vzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdEFjY2VzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRoZSBJZGVudGl0eSBwcm9kdWN0IChuYW1lLCBlbWFpbCwgcGhvbmUsIGFkZHJlc3MpLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBhY2NvdW50IG51bWJlciBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRyYW5zYWN0aW9uIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfcm91dGluZ19udW1iZXJcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19yb3V0aW5nX251bWJlcj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3RheF9zdGF0ZW1lbnRzXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfdGF4X3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImN1c3RvbWVyc19wcm9maWxlc1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGN1c3RvbWVyc19wcm9maWxlcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgQXV0aC4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgYXV0aGAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBBdXRoZW50aWNhdGlvbiBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIElkZW50aXR5LiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBpZGVudGl0eWAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBJZGVudGl0eSBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cyBoZWFsdGggb2YgYSByZXF1ZXN0IHR5cGUuIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgTGlhYmlsaXRpZXMgcmVxdWVzdHMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBhbmQgSXRlbSBsb2dpbnMgZWFjaCBoYXZlIHRoZWlyIG93biBzdGF0dXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBgYnJlYWtkb3duYCBvYmplY3QsIHdoaWNoIHByb3ZpZGVzIG1vcmUgZ3JhbnVsYXIgaW5zdGl0dXRpb24gaGVhbHRoIGRhdGEuICBgSEVBTFRIWWA6IHRoZSBtYWpvcml0eSBvZiByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgREVHUkFERURgOiBvbmx5IHNvbWUgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERPV05gOiBhbGwgcmVxdWVzdHMgYXJlIGZhaWxpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdHRlZCB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3RhdHVzIGNoYW5nZSBmb3IgdGhlIGluc3RpdHV0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfY2hhbmdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXNCcmVha2Rvd259XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IFByb2R1Y3RTdGF0dXNCcmVha2Rvd247XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c1N0YXR1c0VudW0ge1xuICAgIEhlYWx0aHkgPSAnSEVBTFRIWScsXG4gICAgRGVncmFkZWQgPSAnREVHUkFERUQnLFxuICAgIERvd24gPSAnRE9XTidcbn1cblxuLyoqXG4gKiBBIGRldGFpbGVkIGJyZWFrZG93biBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIHBlcmZvcm1hbmNlIGZvciBhIHJlcXVlc3QgdHlwZS4gVGhlIHZhbHVlcyBmb3IgYHN1Y2Nlc3NgLCBgZXJyb3JfcGxhaWRgLCBhbmQgYGVycm9yX2luc3RpdHV0aW9uYCBzdW0gdG8gMS4gVGhlIHRpbWUgcmFuZ2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGJyZWFrZG93biBtYXkgcmFuZ2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgZmV3IG1pbnV0ZXMgdG8gdGhlIHBhc3Qgc2l4IGhvdXJzLiBJbiBnZW5lcmFsLCBzbWFsbGVyIGluc3RpdHV0aW9ucyB3aWxsIHNob3cgc3RhdHVzIHRoYXQgd2FzIGNhbGN1bGF0ZWQgb3ZlciBhIGxvbmdlciBwZXJpb2Qgb2YgdGltZS4gRm9yIEludmVzdG1lbnQgdXBkYXRlcywgd2hpY2ggYXJlIHJlZnJlc2hlZCBsZXNzIGZyZXF1ZW50bHksIHRoZSBwZXJpb2QgYXNzZXNzZWQgbWF5IGJlIDI0IGhvdXJzIG9yIG1vcmUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbSW5zdGl0dXRpb24gc3RhdHVzIGRldGFpbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jaW5zdGl0dXRpb24tc3RhdHVzLWRldGFpbHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVmcmVzaF9pbnRlcnZhbGAgbWF5IGJlIGBERUxBWUVEYCBvciBgU1RPUFBFRGAgZXZlbiB3aGVuIHRoZSBzdWNjZXNzIHJhdGUgaXMgaGlnaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkIGZvciBUcmFuc2FjdGlvbnMgc3RhdHVzIGJyZWFrZG93bnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSWRlbnRpdHlNYXRjaCA9ICdpZGVudGl0eV9tYXRjaCcsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEludmVzdG1lbnRzQXV0aCA9ICdpbnZlc3RtZW50c19hdXRoJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUGF5bWVudEluaXRpYXRpb24gPSAncGF5bWVudF9pbml0aWF0aW9uJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbiA9ICdpZGVudGl0eV92ZXJpZmljYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBEZXBvc2l0U3dpdGNoID0gJ2RlcG9zaXRfc3dpdGNoJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBFbXBsb3ltZW50ID0gJ2VtcGxveW1lbnQnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9ucyA9ICdyZWN1cnJpbmdfdHJhbnNhY3Rpb25zJyxcbiAgICBTaWduYWwgPSAnc2lnbmFsJyxcbiAgICBTdGF0ZW1lbnRzID0gJ3N0YXRlbWVudHMnXG59XG5cbi8qKlxuICogVGhlIHZhbGlkIG5hbWUgbWF0Y2hpbmcgc2Vuc2l0aXZpdHkgY29uZmlndXJhdGlvbnMgZm9yIGEgc2NyZWVuaW5nIHByb2dyYW0uIE5vdGUgdGhhdCB3aGlsZSBjZXJ0YWluIG1hdGNoaW5nIHRlY2huaXF1ZXMgbWF5IGJlIG1vcmUgcHJldmFsZW50IG9uIGxlc3Mgc3RyaWN0IHNldHRpbmdzLCBhbGwgbWF0Y2hpbmcgYWxnb3JpdGhtcyBhcmUgZW5hYmxlZCBmb3IgZXZlcnkgc2Vuc2l0aXZpdHkuICBgY29hcnNlYCAtIFNlZSBtb3JlIHBvdGVudGlhbCBtYXRjaGVzLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgc2VlIG1vcmUgYnJvYWQgcGhvbmV0aWMgbWF0Y2hlcyBhY3Jvc3MgYWxwaGFiZXRzIHRoYXQgbWFrZSBtaXNzaW5nIGEgcG90ZW50aWFsIGhpdCB2ZXJ5IHVubGlrZWx5LiBUaGlzIHNldHRpbmcgaXMgbm9pc2llciBhbmQgd2lsbCByZXF1aXJlIG1vcmUgbWFudWFsIHJldmlldy4gIGBiYWxhbmNlZGAgLSBBIGdvb2QgZGVmYXVsdCBmb3IgbW9zdCBjb21wYW5pZXMuIFRoaXMgc2Vuc2l0aXZpdHkgaXMgYmFsYW5jZWQgdG8gc2hvdyBoaWdoIHF1YWxpdHkgaGl0cyB3aXRoIHJlZHVjZWQgbm9pc2UuICBgc3RyaWN0YCAtIEFnZ3Jlc3NpdmUgZmFsc2UgcG9zaXRpdmUgcmVkdWN0aW9uLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgcmVxdWlyZSBuYW1lcyB0byBiZSBtb3JlIHNpbWlsYXIgdGhhbiBgY29hcnNlYCBhbmQgYGJhbGFuY2VkYCBzZXR0aW5ncywgcmVseWluZyBsZXNzIG9uIHBob25ldGljcywgd2hpbGUgc3RpbGwgYWNjb3VudGluZyBmb3IgY2hhcmFjdGVyIHRyYW5zcG9zaXRpb25zLCBtaXNzaW5nIHRva2VucywgYW5kIG90aGVyIGNvbW1vbiBwZXJtdXRhdGlvbnMuICBgZXhhY3RgIC0gTWF0Y2hlcyBtdXN0IGJlIG5lYXJseSBleGFjdC4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIG9ubHkgc2hvdyBoaXRzIHdpdGggZXhhY3Qgb3IgbmVhcmx5IGV4YWN0IG5hbWUgbWF0Y2hlcyB3aXRoIG9ubHkgYmFzaWMgY29ycmVjdGlvbiBzdWNoIGFzIGV4dHJhbmVvdXMgc3ltYm9scyBhbmQgY2FwaXRhbGl6YXRpb24uIFRoaXMgc2V0dGluZyBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UgaGF2ZSBhIHZlcnkgc3BlY2lmaWMgdXNlIGNhc2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5IHtcbiAgICBDb2Fyc2UgPSAnY29hcnNlJyxcbiAgICBCYWxhbmNlZCA9ICdiYWxhbmNlZCcsXG4gICAgU3RyaWN0ID0gJ3N0cmljdCcsXG4gICAgRXhhY3QgPSAnZXhhY3QnXG59XG5cbi8qKlxuICogVGhlIGVtcGxveWVlXFwncyBlc3RpbWF0ZWQgYW5udWFsIHNhbGFyeSwgYXMgZGVyaXZlZCBmcm9tIGluZm9ybWF0aW9uIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBuZXR3b3JrIHByb3h5IGlzIHByZXNlbnQgYW5kIGlmIHNvIHdoYXQgdHlwZSBpdCBpcy4gIGBub25lX2RldGVjdGVkYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgbm90IG9uIGEgZGV0ZWN0YWJsZSBwcm94eSBuZXR3b3JrLiAgYHRvcmAgaW5kaWNhdGVzIHRoZSB1c2VyIHdhcyB1c2luZyBhIFRvciBicm93c2VyLCB3aGljaCBzZW5kcyBlbmNyeXB0ZWQgdHJhZmZpYyBvbiBhIGRlY2VudHJhbGl6ZWQgbmV0d29yayBhbmQgaXMgc29tZXdoYXQgc2ltaWxhciB0byBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspLiAgYHZwbmAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykgIGB3ZWJfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIG1heSBhbGxvdyB0aGVtIHRvIGNvbmNlYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGVpciBJUCBhZGRyZXNzIG9yIG90aGVyIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgYHB1YmxpY19wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgcHVibGljIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYSB3ZWIgcHJveHkgYnV0IGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdXNlcnMuIFRoaXMgbWF5IGFsbG93IG11bHRpcGxlIHVzZXJzIHRvIGFwcGVhciBhcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAgYWRkcmVzcyBmb3IgaW5zdGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm94eVR5cGUge1xuICAgIE5vbmVEZXRlY3RlZCA9ICdub25lX2RldGVjdGVkJyxcbiAgICBUb3IgPSAndG9yJyxcbiAgICBWcG4gPSAndnBuJyxcbiAgICBXZWJQcm94eSA9ICd3ZWJfcHJveHknLFxuICAgIFB1YmxpY1Byb3h5ID0gJ3B1YmxpY19wcm94eSdcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtLCBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9FUlJPUlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX1JFUVVJUkVEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNDAwXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGh0dHBfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNvbHZlIGEgR29vZ2xlIHJlQ0FQVENIQSBjaGFsbGVuZ2UgaW4gdGhlIExpbmsgUmVjYXB0Y2hhIHBhbmUuIElmIHRoZXkgc29sdmUgdGhlIGNoYWxsZW5nZSBzdWNjZXNzZnVsbHksIHRoZSB1c2VyXFwncyByZXF1ZXN0IGlzIHJlc3VibWl0dGVkIGFuZCB0aGV5IGFyZSBkaXJlY3RlZCB0byB0aGUgbmV4dCBJdGVtIGNyZWF0aW9uIHN0ZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGxpbmtfdXNlcl9leHBlcmllbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBTdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHlvdSBuZWVkIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc2lnaHRzIHJlbGF0aW5nIHRvIGV4cGVuc2VzIGFuZCBkZXBvc2l0cyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gb2NjdXIgb24gYSBzY2hlZHVsZWQgYmFzaXMsIHN1Y2ggYXMgYml3ZWVrbHksIG1vbnRobHksIG9yIGFubnVhbGx5LiAgQ29tbW9uIGV4YW1wbGVzIGluY2x1ZGUgbG9hbiBwYXltZW50cywgYmlsbCBwYXltZW50cywgc3Vic2NyaXB0aW9ucywgYW5kIHBheXJvbGwgaW5jb21lLiAgVGhpcyBpcyBhIGJldGEgZmllbGQsIGF2YWlsYWJsZSB0byBhbGwgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmVuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmVuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdHJhbnNhY3Rpb24gaXMgcGVyaW9kaWNhbGx5IHJlY3VycmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNhbmNlbGxlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19DQU5DRUxMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYERBSUxZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBkYXkuICBgRFlOQU1JQ2A6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgdmFyaWVzIGluIHJlY3VycmVuY2UgZnJlcXVlbmN5LiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHN0cmVhbXMgaW4gdGhlIGdpZyBlY29ub215LiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGlzblxcJ3QgcmVjdXJyaW5nIGluIG5hdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ0ZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgRHluYW1pYyA9ICdEWU5BTUlDJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgb24gdGhlIHBsYW5uZWQgZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0ZFUl9TS0lQUEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbl9yYXRpb25hbGVfY29kZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxhbm5lZCBkYXRlIG9uIHdoaWNoIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBza2lwcGVkX29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHJlbW92ZWQgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZW1vdmVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrQmVoYXZpb3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm94eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3Byb3h5X3R5cGU6IFByb3h5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2Ygc3BhbSBsaXN0cyB0aGUgSVAgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfc3BhbV9saXN0X2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVUQyBvZmZzZXQgb2YgdGhlIHRpbWV6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVAgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF90aW1lem9uZV9vZmZzZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGVtYWlsYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0VtYWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgaXNfZGVsaXZlcmFibGU6IFJpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb3VudCBvZiBhbGwga25vd24gYnJlYWNoZXMgb2YgdGhpcyBlbWFpbCBhZGRyZXNzIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgYnJlYWNoX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGZpcnN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxhc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX3JlZ2lzdGVyZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2ZyZWVfcHJvdmlkZXI6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b219XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2N1c3RvbTogUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2Rpc3Bvc2FibGU6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHRvcF9sZXZlbF9kb21haW5faXNfc3VzcGljaW91czogUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygb25saW5lIHNlcnZpY2VzIHdoZXJlIHRoaXMgZW1haWwgYWRkcmVzcyBoYXMgYmVlbiBkZXRlY3RlZCB0byBoYXZlIGFjY291bnRzIG9yIG90aGVyIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbGlua2VkX3NlcnZpY2VzOiBTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT47XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBjdXN0b20gaWYga25vd24sIGkuZS4gYSBjb21wYW55IGRvbWFpbiBhbmQgbm90IGZyZWUgb3IgZGlzcG9zYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b20ge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgZG9tYWluIGlzIGxpc3RlZCBhcyBkaXNwb3NhYmxlIGlmIGtub3duLiBEaXNwb3NhYmxlIGRvbWFpbnMgYXJlIG9mdGVuIHVzZWQgdG8gY3JlYXRlIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXJ0IG9mIGEgZmFrZSBzZXQgb2YgdXNlciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGUge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgYSBmcmVlIHByb3ZpZGVyIHN1Y2ggYXMgR21haWwgb3IgSG90bWFpbCBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXIge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBTTVRQLU1YIGNoZWNrIHRvIGNvbmZpcm0gdGhlIGVtYWlsIGFkZHJlc3MgZXhpc3RzIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgdG9wIGxldmVsIGRvbWFpbiwgd2hpY2ggaXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG9tYWluLCBpcyBmcmF1ZHVsZW50IG9yIHJpc2t5IGlmIGtub3duLiBJbiBtb3N0IGNhc2VzLCBhIHN1c3BpY2lvdXMgdG9wIGxldmVsIGRvbWFpbiBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCBhIGRpc3Bvc2FibGUgb3IgaGlnaC1yaXNrIGRvbWFpbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3QgY2FwdHVyaW5nIGFidXNlIHNpZ25hbHMgcmVsYXRlZCB0byBgaWRlbnRpdHkgYWJ1c2VgLCBlLmcuIHN0b2xlbiBhbmQgc3ludGhldGljIGlkZW50aXR5IGZyYXVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrU3ludGhldGljSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzXG4gICAgICovXG4gICAgc3ludGhldGljX2lkZW50aXR5OiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N0b2xlbklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN0b2xlbl9pZGVudGl0eTogUmlza0NoZWNrU3RvbGVuSWRlbnRpdHkgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYSBsaW5rZWQgc2VydmljZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBFYmF5ID0gJ2ViYXknLFxuICAgIEZhY2Vib29rID0gJ2ZhY2Vib29rJyxcbiAgICBGbGlja3IgPSAnZmxpY2tyJyxcbiAgICBGb3Vyc3F1YXJlID0gJ2ZvdXJzcXVhcmUnLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBMYXN0Zm0gPSAnbGFzdGZtJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBQaW50ZXJlc3QgPSAncGludGVyZXN0JyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU3BvdGlmeSA9ICdzcG90aWZ5JyxcbiAgICBUZWxlZ3JhbSA9ICd0ZWxlZ3JhbScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWaWJlciA9ICd2aWJlcicsXG4gICAgVmltZW8gPSAndmltZW8nLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgWWFob28gPSAneWFob28nLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEJvb2tpbmcgPSAnYm9va2luZycsXG4gICAgRGlzY29yZCA9ICdkaXNjb3JkJyxcbiAgICBLYWthbyA9ICdrYWthbycsXG4gICAgT2sgPSAnb2snLFxuICAgIFF6b25lID0gJ3F6b25lJyxcbiAgICBMaW5lID0gJ2xpbmUnLFxuICAgIFNuYXBjaGF0ID0gJ3NuYXBjaGF0JyxcbiAgICBaYWxvID0gJ3phbG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgcGhvbmVgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIHBob25lIG51bWJlciBoYXMgYmVlbiBkZXRlY3RlZCB0byBoYXZlIGFjY291bnRzIG9yIG90aGVyIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgbGlua2VkX3NlcnZpY2VzOiBTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT47XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3RvbGVuIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N0b2xlbklkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogRmllbGQgY29udGFpbmluZyB0aGUgZGF0YSB1c2VkIGluIGRldGVybWluaW5nIHRoZSBvdXRjb21lIG9mIHRoZSBzeW50aGV0aWMgaWRlbnRpdHkgcmlzayBjaGVjay4gIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOiAgYHNjb3JlYCAtIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIHVzZXIgaXMgYSBzeW50aGV0aWMgaWRlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIHVzZXIgaXMgYSBzeW50aGV0aWMgaWRlbnRpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSB0cmFuc2FjdGlvbiByZXN1bHQgYWZ0ZXIgZXZhbHVhdGVkIGJ5IHRoZSByZXF1ZXN0ZWQgcmlzayBwcm9maWxlLiBJZiBhIGByaXNrX3Byb2ZpbGVfa2V5YCBpcyBub3QgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkLiBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1Byb2ZpbGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tQcm9maWxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmlzayBwcm9maWxlIHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1Byb2ZpbGVcbiAgICAgKi9cbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2YWx1YXRlZCBvdXRjb21lIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgZm9yIHRoZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIHN0YXR1cz86IFJpc2tTaWduYWxEb2N1bWVudFN0YXR1cztcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogQURvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlXG4gICAgICovXG4gICAgUk9MRV9ERVRBSUw6IFJvbGVEZXRhaWw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZURldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eVJvbGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlRGV0YWlsXG4gICAgICovXG4gICAgUGFydHlSb2xlVHlwZTogUGFydHlSb2xlVHlwZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZX1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZXNcbiAgICAgKi9cbiAgICBST0xFOiBSb2xlO1xufVxuLyoqXG4gKiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBVUkwgc2V0IGluIHRoZSBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX292ZXJyaWRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfZmllbGRzOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHM7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgY29kZXMgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byB0ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlIHtcbiAgICBVcGRhdGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEUnLFxuICAgIENvbXBsZXRlID0gJ0JBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEUnXG59XG5cbi8qKlxuICogT3B0aW9uYWwgZmllbGRzIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIHRoZSBzaW11bGF0ZWQgd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IFdlYmhvb2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW0ge1xuICAgIERlZmF1bHRVcGRhdGUgPSAnREVGQVVMVF9VUERBVEUnLFxuICAgIE5ld0FjY291bnRzQXZhaWxhYmxlID0gJ05FV19BQ0NPVU5UU19BVkFJTEFCTEUnLFxuICAgIEF1dGhEYXRhVXBkYXRlID0gJ0FVVEhfREFUQV9VUERBVEUnLFxuICAgIEF1dGhvcml6YXRpb25HcmFudGVkID0gJ0FVVEhPUklaQVRJT05fR1JBTlRFRCcsXG4gICAgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlID0gJ1JFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFJyxcbiAgICBTeW5jVXBkYXRlc0F2YWlsYWJsZSA9ICdTWU5DX1VQREFURVNfQVZBSUxBQkxFJyxcbiAgICBQcm9kdWN0UmVhZHkgPSAnUFJPRFVDVF9SRUFEWScsXG4gICAgRXJyb3IgPSAnRVJST1InXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGlzIGB0cnVlYCAgaWYgdGhlIHRlc3RgIHdlYmhvb2tfY29kZWAgIHdhcyBzdWNjZXNzZnVsbHkgZmlyZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2tfZmlyZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgb2F1dGhfc3RhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0aGUgSXRlbSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHByb2Nlc3NvciB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIGAvcHJvY2Vzc29yL2AgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2Ygb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29uZmlndXJpbmcgdGhlIEl0ZW0uIElmIHNwZWNpZmllZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3ZWJob29rIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXcgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGB1c2VyX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlc3QgcGFzc3dvcmQgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgcGFzc19nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3Bhc3N3b3JkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb24/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbjtcbn1cbi8qKlxuICogQSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBvcHRpb25zLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYGluaXRpYWxfcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZTtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbnMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCBvbmx5IHRoZSBwZW5kaW5nIGJhbGFuY2UgdGhhdCBpcyBkdWUgYmVmb3JlIHRoZSBgdmlydHVhbF90aW1lc3RhbXBgIG9uIHRoZSB0ZXN0IGNsb2NrIHdpbGwgYmUgY29udmVydGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBldmVudCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcmVmdW5kLnBvc3RlZGAsIGByZWZ1bmQuc2V0dGxlZGAsIGByZWZ1bmQuZmFpbGVkYCwgb3IgYHJlZnVuZC5yZXR1cm5lZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHJlZnVuZCBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcmVmdW5kLnBlbmRpbmdgIC0tPiBgcmVmdW5kLmZhaWxlZGAgIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQucG9zdGVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnJldHVybmVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnNldHRsZWRgICBgcmVmdW5kLnBvc3RlZGAgZXZlbnRzIGNhbiBvbmx5IGJlIHNpbXVsYXRlZCBpZiB0aGUgcmVmdW5kZWQgdHJhbnNmZXIgaGFzIGJlZW4gdHJhbnNpdGlvbmVkIHRvIHNldHRsZWQuIFRoaXMgbWltaWNzIHRoZSBvcmRlcmluZyBvZiBldmVudHMgaW4gUHJvZHVjdGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldHVybmVkYCAgYHBvc3RlZGAgLS0+IGBzZXR0bGVkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIHN3ZWVwIHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIG9uIHRoZSBkYXkgb2YgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBgdGVzdF9jbG9ja2AuIElmIHRoZSBkYXRlIG9mIGB2aXJ0dWFsX3RpbWVgIGlzIG9uIHdlZWtlbmQgb3IgYSBmZWRlcmFsIGhvbGlkYXksIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcD86IFNpbXVsYXRlZFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmlydHVhbCB0aW1lc3RhbXAgb24gdGhlIHRlc3QgY2xvY2suIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGltZXN0YW1wIHdpbGwgYmUgdXNlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUZXN0Q2xvY2t9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9jazogVHJhbnNmZXJUZXN0Q2xvY2s7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluZGljYXRvciBmb3Igd2hlbiBzY29wZXMgYXJlIGJlaW5nIHVwZGF0ZWQuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIHZpYSBlbnJvbGxtZW50IChpLmUuIE9BdXRoKSwgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBFTlJPTExNRU5UYC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgaW4gYSBwb3N0LWVucm9sbG1lbnQgdmlldywgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBQT1JUQUxgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2NvcGVzQ29udGV4dCB7XG4gICAgRW5yb2xsbWVudCA9ICdFTlJPTExNRU5UJyxcbiAgICBQb3J0YWwgPSAnUE9SVEFMJ1xufVxuXG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTY29wZXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdXNlciBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCB0aGF0IHdlcmUgY29tcGFyZWQgd2hlbiB0aGUgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AsIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIG9mIGJpcnRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZGF0ZXNfb2ZfYmlydGg/OiBBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIExvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogQXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIE5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIG5hbWVzPzogQXJyYXk8U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz47XG59XG4vKipcbiAqIEFuYWx5emVkIGRhdGUgb2YgYmlydGggZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRlUmFuZ2V9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGRhdGE/OiBEYXRlUmFuZ2U7XG59XG4vKipcbiAqIEFuYWx5emVkIGRvY3VtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50O1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBpbmRpdmlkdWFsIHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgU0NSRUVOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHNjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHNlY3VyaXR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzaW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjdXNpcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlZG9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZ2l2ZW4gdG8gdGhlIHNlY3VyaXR5IGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkYCBpcyBwcmVzZW50LCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgUGxhaWQgYGluc3RpdHV0aW9uX2lkYCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gd2hvbSB0aGUgaWRlbnRpZmllciBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW4gY2VydGFpbiBjYXNlcywgUGxhaWQgd2lsbCBwcm92aWRlIHRoZSBJRCBvZiBhbm90aGVyIHNlY3VyaXR5IHdob3NlIHBlcmZvcm1hbmNlIHJlc2VtYmxlcyB0aGlzIHNlY3VyaXR5LCB0eXBpY2FsbHkgd2hlbiB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgaGFzIGxvdyB2b2x1bWUsIG9yIHdoZW4gYSBwcml2YXRlIHNlY3VyaXR5IGNhbiBiZSBtb2RlbGVkIHdpdGggYSBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBwcm94eV9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgc2VjdXJpdHkgaXMgYSBoaWdobHkgbGlxdWlkIGFzc2V0IGFuZCBjYW4gYmUgdHJlYXRlZCBsaWtlIGNhc2guXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNfY2FzaF9lcXVpdmFsZW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgdHlwZSBvZiB0aGUgaG9sZGluZy4gVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3B0aW9uQ29udHJhY3R9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgb3B0aW9uX2NvbnRyYWN0OiBPcHRpb25Db250cmFjdCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzaW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHNlbGZpZSBhbmQgdGhlIGRvY3VtZW50IChpZiBkb2N1bWVudGFyeSB2ZXJpZmljYXRpb24gYWxzbyByYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb24ge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIFRoZSBpbWFnZSBvciB2aWRlbyBjYXB0dXJlIG9mIGEgc2VsZmllLiBPbmx5IG9uZSBvZiBpbWFnZSBvciB2aWRlbyBVUkwgd2lsbCBiZSBwb3B1bGF0ZWQgcGVyIHNlbGZpZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgZm9yIGRvd25sb2FkaW5nIGFuIGltYWdlIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYSB2aWRlbyBzZWxmaWUgY2FwdHVyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDYXB0dXJlXG4gICAgICovXG4gICAgdmlkZW9fdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLnNlbGZpZV9jaGVja2AgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2tTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVDaGVja1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBzZWxmaWVzIHN1Ym1pdHRlZCB0byB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PFNlbGZpZUNoZWNrU2VsZmllPn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzZWxmaWVzOiBBcnJheTxTZWxmaWVDaGVja1NlbGZpZT47XG59XG4vKipcbiAqIENhcHR1cmVzIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3Mgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1NlbGZpZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIHN0YXR1czogU2VsZmllU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBzZWxmaWUgdXBsb2FkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDYXB0dXJlfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGNhcHR1cmU6IFNlbGZpZUNhcHR1cmU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBTZWxmaWVBbmFseXNpcztcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5zZWxmaWVfY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQ2hlY2tTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvdXRjb21lIHN0YXR1cyBmb3IgdGhpcyBzcGVjaWZpYyBzZWxmaWUuIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYHNlbGZpZV9jaGVjay5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBzZWxmaWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VuZGVyQkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiBcXFwiTW96aWxsYS81LjBcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY29yZSBhdHRyaWJ1dGVzIG9iamVjdCBjb250YWlucyBhZGRpdGlvbmFsIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgdGhlIEFDSCByZXR1cm4gcmlzay4gRXhhbXBsZXMgb2YgZGF0YSBpbmNsdWRlOiAgYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIGBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50YDogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50ICBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGlzIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uOyBgZmFsc2VgIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJpc2sgcHJvZmlsZSB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIEEgcmlzayBwcm9maWxlIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHZpYSB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIHJpc2sgcHJvZmlsZSB3aWxsIGJlIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJpc2tfcHJvZmlsZV9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvaW5jb21lL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzPzogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1Byb2ZpbGV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX3Byb2ZpbGU/OiBSaXNrUHJvZmlsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIHRoZSByaXNrIGFzc2Vzc21lbnQuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBwYXltZW50IG1ldGhvZC4gIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTkFDSEEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5ICBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyAgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSAgYFJFQUxfVElNRV9QQVlNRU5UU2A6IHJlYWwtdGltZSBwYXltZW50cyBzdWNoIGFzIFJUUCBhbmQgRmVkTm93ICBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgIFBvc3NpYmxlIHZhbHVlczogYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2AgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTaWduYWxQYXltZW50TWV0aG9kIHtcbiAgICBTYW1lRGF5QWNoID0gJ1NBTUVfREFZX0FDSCcsXG4gICAgTmV4dERheUFjaCA9ICdORVhUX0RBWV9BQ0gnLFxuICAgIFN0YW5kYXJkQWNoID0gJ1NUQU5EQVJEX0FDSCcsXG4gICAgUmVhbFRpbWVQYXltZW50cyA9ICdSRUFMX1RJTUVfUEFZTUVOVFMnLFxuICAgIERlYml0Q2FyZCA9ICdERUJJVF9DQVJEJyxcbiAgICBNdWx0aXBsZVBheW1lbnRNZXRob2RzID0gJ01VTFRJUExFX1BBWU1FTlRfTUVUSE9EUydcbn1cblxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbmFtZSBwcmVmaXggKGUuZy4gXFxcIk1yLlxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHByZWZpeD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGdpdmVuIG5hbWUuIElmIHRoZSB1c2VyIGhhcyBhIG9uZS13b3JkIG5hbWUsIGl0IHNob3VsZCBiZSBwcm92aWRlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmYW1pbHkgbmFtZSAvIHN1cm5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHN1ZmZpeCAoZS5nLiBcXFwiSUlcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBzdWZmaXg/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxQcmVwYXJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxVc2VyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBTaWduYWxQZXJzb25OYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDb252ZXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBtaXNzaW5nIG9yIHN0YWxlIGJhbmsgZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgL3NpZ25hbC9ldmFsdWF0ZSBzY29yZXMgYW5kIHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSBTaWduYWwgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2FybmluZyB0eXBlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN3ZWVwIHJldHVybmVkIGZyb20gdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQuIENhbiBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFuc2ZlcnMgdG8gaW5jbHVkZSBpbiBhIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIGRlY2ltYWwgYW1vdW50IG9mIHRoZSBzd2VlcCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgc3dlZXAgYWNjb3VudCBsZWRnZXIgKGUuZy4gXFxcIi0xMC4wMFxcXCIpICBJZiBhbW91bnQgaXMgbm90IHByZXNlbnQsIHRoZSBzd2VlcCB3YXMgbmV0LXNldHRsZWQgdG8gemVybyBhbmQgb3V0c3RhbmRpbmcgZGViaXRzIGFuZCBjcmVkaXRzIGJldHdlZW4gdGhlIHN3ZWVwIGFjY291bnQgYW5kIFBsYWlkIGFyZSBiYWxhbmNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzd2VlcCBzZXR0bGVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHNldHRsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc3RhdHVzPzogU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEN1cnJlbnRseSwgdGhlIGZpZWxkIHdpbGwgcmVtYWluIG51bGwgZm9yIHRyYW5zZmVycyBvbiBvdGhlciByYWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGRlcG9zaXRvcnlgIGFjY291bnRzIGFyZTogQXV0aCAoYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIHR5cGVzIG9ubHkpLCBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBQYXltZW50IEluaXRpYXRpb24sIEFzc2V0cywgYW5kIEludmVzdG1lbnRzIChgY2FzaCBtYW5hZ2VtZW50YCB0eXBlIG9ubHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNyZWRpdCBjYXJkIHR5cGUgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgY3JlZGl0YCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBMaWFiaWxpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBjcmVkaXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxvYW4gdHlwZSBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBsb2FuYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIExpYWJpbGl0aWVzLCBhbmQgVHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGxvYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpbnZlc3RtZW50IGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGludmVzdG1lbnRgIGFjY291bnRzIGFyZTogQmFsYW5jZSBhbmQgSW52ZXN0bWVudHMuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGludmVzdG1lbnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdGhlciBvciB1bmtub3duIGFjY291bnQgdHlwZS4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgb3RoZXJgIGFjY291bnRzIGFyZTogQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgYW5kIEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGN1cnJlbmN5IGNvZGVzIGFyZSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHN1cHBvcnRzIGFsbCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgdmFsdWVzIGZvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcy4gTm90ZSB0aGF0IHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgaW5mbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgbmVnYXRpdmUgYW1vdW50cywgb3V0ZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIHBvc2l0aXZlIGFtb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEJ1eWluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBidXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZWxsaW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHNlbGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhbmNlbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYXNoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmVlcyBvbiB0aGUgYWNjb3VudCwgZS5nLiBjb21taXNzaW9uLCBib29ra2VlcGluZywgb3B0aW9ucy1yZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgZmVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbWFzazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9vZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnR5cGUgb2YgdGhlIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHN0YXRlbWVudHNcXCcgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgc3RhdGVtZW50czogQXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD47XG59XG4vKipcbiAqIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9kb3dubG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogU3RhdGVtZW50c0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFN0YXRlbWVudHNBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBzdGF0ZW1lbnQgcmVmcmVzaCBleHRyYWN0aW9uICBgU1VDQ0VTU2A6IFRoZSBzdGF0ZW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCBhbmQgY2FuIGJlIGxpc3RlZCB2aWEgYC9zdGF0ZW1lbnRzL2xpc3QvYCBhbmQgZG93bmxvYWRlZCB2aWEgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkL2AuICBgRkFJTFVSRWA6IFRoZSBzdGF0ZW1lbnRzIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHJlZnJlc2hlZCBzdGF0ZW1lbnRzIGV4dHJhY3Rpb24gaXMgY29tcGxldGVkIG9yIGZhaWxlZCB0byBiZSBjb21wbGV0ZWQuIFRyaWdnZXJlZCBieSBjYWxsaW5nIGAvc3RhdGVtZW50cy9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVEVNRU5UU19SRUZSRVNIX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIzLTA4LTMwXFxcIi4gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGF0ZSByYW5nZSwgUGxhaWQgd2lsbCB1c2UgdGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZS4gVGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZSBpcyB0eXBpY2FsbHkgZWl0aGVyIHRoZSBsYXN0IGRheSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCwgb3IgdGhlIGZvbGxvd2luZyBkYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4g4oCcWVlZWS1NTS1EROKAnSBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudExvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2lzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgbG9hbiwgZS5nLiwgXFxcIkNvbnNvbGlkYXRpb24gTG9hbnNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcGF5bWVudCBkdWUgZm9yIHRoZSBuZXh0IGJpbGxpbmcgY3ljbGUuIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnM6IFNvbWUgaW5zdGl0dXRpb25zIHJlcXVpcmUgYSBtaW5pbXVtIHBheW1lbnQgYWNyb3NzIGFsbCBsb2FucyBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudCBudW1iZXIuIE91ciBBUEkgcHJlc2VudHMgdGhhdCBzYW1lIG1pbmltdW0gcGF5bWVudCBhbW91bnQgb24gZWFjaCBsb2FuLiBUaGUgaW5zdGl0dXRpb25zIHRoYXQgZG8gdGhpcyBhcmU6IEdyZWF0IExha2VzICggYGluc18xMTY4NjFgKSwgRmlyc3RtYXJrIChgaW5zXzExNjI5NWApLCBDb21tb25ib25kIEZpcnN0bWFyayBTZXJ2aWNlcyAoYGluc18xMTY5NTBgKSwgTmVsbmV0IChgaW5zXzExNjUyOGApLCBFZEZpbmFuY2lhbCBTZXJ2aWNlcyAoYGluc18xMTYzMDRgKSwgR3Jhbml0ZSBTdGF0ZSAoYGluc18xMTYzMDhgKSwgYW5kIE9rbGFob21hIFN0dWRlbnQgTG9hbiBBdXRob3JpdHkgKGBpbnNfMTE2OTQ1YCkuIEZpcnN0bWFyayAoYGluc18xMTYyOTVgICkgYW5kIE5hdmllbnQgKGBpbnNfMTE2MjQ4YCkgd2lsbCBkaXNwbGF5IGFzICQwIGlmIHRoZXJlIGlzIGFuIGF1dG9wYXkgcHJvZ3JhbSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBBIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkIGlmIGBsb2FuX3N0YXR1cy50eXBlYCBpcyBgZGVmZXJtZW50YCwgYGluX3NjaG9vbGAsIGBjb25zb2xpZGF0ZWRgLCBgcGFpZCBpbiBmdWxsYCwgb3IgYHRyYW5zZmVycmVkYC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRvbGxhciBhbW91bnQgb2YgdGhlIGFjY3J1ZWQgaW50ZXJlc3QgYmFsYW5jZS4gRm9yIFNhbGxpZSBNYWUgKCBgaW5zXzExNjk0NGApLCB0aGlzIGFtb3VudCBpcyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBsb2FuLCBzbyB0aGlzIGZpZWxkIHdpbGwgcmV0dXJuIGFzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX2ludGVyZXN0X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgYWNjb3VudCBudW1iZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBsb2FuIGZvciBwYXltZW50cy4gSW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzLCBgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyYCB3aWxsIG1hdGNoIGBhY2NvdW50X251bWJlcixgIGJ1dCBpbiBzb21lIGluc3RpdHV0aW9ucywgc3VjaCBhcyBHcmVhdCBMYWtlcyAoYGluc18xMTY4NjFgKSwgaXQgd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBwYXltZW50X3JlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRSZXBheW1lbnRQbGFuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEludGVyZXN0T25seSA9ICdpbnRlcmVzdC1vbmx5JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGF5QXNZb3VFYXJuID0gJ3BheSBhcyB5b3UgZWFybicsXG4gICAgUmV2aXNlZFBheUFzWW91RWFybiA9ICdyZXZpc2VkIHBheSBhcyB5b3UgZWFybicsXG4gICAgU3RhbmRhcmQgPSAnc3RhbmRhcmQnLFxuICAgIFNhdmluZ09uQVZhbHVhYmxlRWR1Y2F0aW9uID0gJ3NhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvbicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzd2VlcCB0cmFuc2ZlciAgYFxcXCJwZW5kaW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3VycmVudGx5IHBlbmRpbmcgYFxcXCJwb3N0ZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiBwb3N0ZWQgYFxcXCJzZXR0bGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIHNldHRsZWQgYFxcXCJyZXR1cm5lZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHJldHVybmVkIGBcXFwiZmFpbGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGZhaWxlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSB0cmlnZ2VyIG9mIHRoZSBzd2VlcCAgYFxcXCJtYW51YWxcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBjdXN0b21lciBgXFxcImluY29taW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSBpbmNvbWluZyBmdW5kcyBmbG93IChlLmcuIEluY29taW5nIFdpcmUpIGBcXFwiYmFsYW5jZV90aHJlc2hvbGRcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGJhbGFuY2UgdGhyZXNob2xkIHNldHRpbmcgYFxcXCJhdXRvbWF0aWNfYWdncmVnYXRlXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSB0aGUgUGxhaWQgYXV0b21hdGljIGFnZ3JlZ2F0aW9uIHByb2Nlc3MuIFRoZXNlIGZ1bmRzIGRpZCBub3QgcGFzcyB0aHJvdWdoIHRoZSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN3ZWVwVHJpZ2dlciB7XG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gICAgSW5jb21pbmcgPSAnaW5jb21pbmcnLFxuICAgIEJhbGFuY2VUaHJlc2hvbGQgPSAnYmFsYW5jZV90aHJlc2hvbGQnLFxuICAgIEF1dG9tYXRpY0FnZ3JlZ2F0ZSA9ICdhdXRvbWF0aWNfYWdncmVnYXRlJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIGNoYW5nZS4gVGhpcyBjYW4gYmUgZHVlIHRvIGFueSBldmVudCByZXN1bHRpbmcgaW4gbmV3IGNoYW5nZXMsIHN1Y2ggYXMgYW4gaW5pdGlhbCAzMC1kYXkgdHJhbnNhY3Rpb25zIGZldGNoIHVwb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIEl0ZW0gd2l0aCB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZmlsbCBvZiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyB0aGF0IG9jY3VycyBzaG9ydGx5IGFmdGVyLCBvciB3aGVuIGNoYW5nZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGEgcmVndWxhcmx5LXNjaGVkdWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGpvYi4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgd2hlbiB1c2luZyB0aGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHRoZSBvbGRlciB3ZWJob29rcyBgSU5JVElBTF9VUERBVEVgLCBgSElTVE9SSUNBTF9VUERBVEVgLCBgREVGQVVMVF9VUERBVEVgLCBhbmQgYFRSQU5TQUNUSU9OU19SRU1PVkVEYCwgd2hpY2ggYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgLCB3aWxsIGFsc28gY29udGludWUgdG8gYmUgc2VudCBpbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRob3NlIHdlYmhvb2tzIHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBhbiBJdGVtLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBvbiB0aGF0IEl0ZW0uIFRoaXMgbWVhbnMgdGhhdCwgdW5saWtlIHRoZSBgSU5JVElBTF9VUERBVEVgIGFuZCBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2tzLCBpdCB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gSXRlbSBjcmVhdGlvbi4gSWYgYC90cmFuc2FjdGlvbnMvc3luY2AgaXMgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCB3YXMgKm5vdCogaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMsIHRoZSB3ZWJob29rIHdpbGwgZmlyZSB0d2ljZTogb25jZSB0aGUgZmlyc3QgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLCBhbmQgYSBzZWNvbmQgdGltZSB3aGVuIGFsbCBhdmFpbGFibGUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiAgVGhpcyB3ZWJob29rIHdpbGwgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCBhcyBpdCB3b3VsZCBpbiBQcm9kdWN0aW9uLiBJdCBjYW4gYWxzbyBiZSBtYW51YWxseSB0cmlnZ2VyZWQgaW4gU2FuZGJveCBieSBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gKG1vc3QgcmVjZW50IDMwIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIChtYXhpbXVtIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLCB1cCB0byAyIHllYXJzKSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgYW4gb2ZmaWNpYWwgZG9jdW1lbnQgdXNlZCB0byByZXBvcnQgdGhlIHVzZXJcXCdzIGluY29tZSB0byB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhmb3JtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUYXhmb3JtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0YXggZG9jdW1lbnQuIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGB3MmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VzJ9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICB3Mj86IFcyO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySURcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySUQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExhc3QgNCBkaWdpdHMgb2YgdW5pcXVlIG51bWJlciBvZiBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsYXN0XzRfZGlnaXRzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySWRlbnRpZmllclxuICAgICAqL1xuICAgIFRheHBheWVySWRlbnRpZmllclR5cGU6IFRheHBheWVySWRlbnRpZmllclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGF4cGF5ZXIgaWRlbnRpZmllciBhcyBhc3NpZ25lZCBieSB0aGUgSVJTIHRvIHRoZSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJWYWx1ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgY2xhc3NpZmllcyBpZGVudGlmaWNhdGlvbiBudW1iZXJzIHVzZWQgYnkgdGhlIEludGVybmFsIFJldmVudWUgU2VydmljZSAoSVJTKSBpbiB0aGUgYWRtaW5pc3RyYXRpb24gb2YgdGF4IGxhd3MuIEEgU29jaWFsIFNlY3VyaXR5IG51bWJlciAoU1NOKSBpcyBpc3N1ZWQgYnkgdGhlIFNTQTsgYWxsIG90aGVyIHRheHBheWVyIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgYXJlIGlzc3VlZCBieSB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVGF4cGF5ZXJJZGVudGlmaWVyVHlwZSB7XG4gICAgSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXIgPSAnSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXInLFxuICAgIFNvY2lhbFNlY3VyaXR5TnVtYmVyID0gJ1NvY2lhbFNlY3VyaXR5TnVtYmVyJ1xufVxuXG4vKipcbiAqIFRoZSBjb2xsZWN0aW9uIG9mIFRBWFBBWUVSX0lERU5USUZJQ0FUSU9OIGVsZW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJzXG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUjogVGF4cGF5ZXJJZGVudGlmaWVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYSBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb259XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogVG90YWxDYW5vbmljYWxEZXNjcmlwdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGV4dCBvZiB0aGUgbGluZSBpdGVtIGFzIHByaW50ZWQgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgRW1wbG95ZWVNZWRpY2FyZSA9ICdFTVBMT1lFRSBNRURJQ0FSRScsXG4gICAgRmljYSA9ICdGSUNBJyxcbiAgICBTb2NpYWxTZWN1cml0eUVtcGxveWVlVGF4ID0gJ1NPQ0lBTCBTRUNVUklUWSBFTVBMT1lFRSBUQVgnLFxuICAgIE1lZGljYWwgPSAnTUVESUNBTCcsXG4gICAgVmlzaW9uID0gJ1ZJU0lPTicsXG4gICAgRGVudGFsID0gJ0RFTlRBTCcsXG4gICAgTmV0UGF5ID0gJ05FVCBQQVknLFxuICAgIFRheGVzID0gJ1RBWEVTJyxcbiAgICBOb3RGb3VuZCA9ICdOT1RfRk9VTkQnLFxuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS4gVG8gcmVjZWl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSB0aGF0IGEgcG9zdGVkIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIGlzIGluIGJldGEgYW5kIHdpbGwgYmUgb21pdHRlZCB1bmxlc3MgdGhlIGNsaWVudCBpcyBib3RoIGVucm9sbGVkIGluIHRoZSBjbG9zZWQgYmV0YSBwcm9ncmFtIGFuZCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhOiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGV0aW1lYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGV0aW1lYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGV0aW1lYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgcmF0aGVyIHRoYW4gcG9zdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCBmaWVsZC4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY29kZTogVHJhbnNhY3Rpb25Db2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRlYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRlYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGV0aW1lYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGV0aW1lYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGV0aW1lYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGRhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBUaGlzIGZpZWxkIHJlcGxhY2VzIHRoZSBgdHJhbnNhY3Rpb25fdHlwZWAgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uQWxsT2ZQYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY29kZTogVHJhbnNhY3Rpb25Db2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkFsbE9mUGF5bWVudENoYW5uZWxFbnVtIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25CYXNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgaXMgaW4gYmV0YSBhbmQgd2lsbCBiZSBvbWl0dGVkIHVubGVzcyB0aGUgY2xpZW50IGlzIGJvdGggZW5yb2xsZWQgaW4gdGhlIGNsb3NlZCBiZXRhIHByb2dyYW0gYW5kIGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG5cbi8qKlxuICogQW4gaWRlbnRpZmllciBjbGFzc2lmeWluZyB0aGUgdHJhbnNhY3Rpb24gdHlwZS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEV1cm9wZWFuIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgYW5kIENhbmFkYSwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYG51bGxgLiAgYGFkanVzdG1lbnQ6YCBCYW5rIGFkanVzdG1lbnQgIGBhdG06YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCB2aWEgYW4gYXV0b21hdGVkIHRlbGxlciBtYWNoaW5lICBgYmFuayBjaGFyZ2U6YCBDaGFyZ2Ugb3IgZmVlIGxldmllZCBieSB0aGUgaW5zdGl0dXRpb24gIGBiaWxsIHBheW1lbnRgOiBQYXltZW50IG9mIGEgYmlsbCAgYGNhc2g6YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCAgYGNhc2hiYWNrOmAgQ2FzaCB3aXRoZHJhd2FsIHdoaWxlIG1ha2luZyBhIGRlYml0IGNhcmQgcHVyY2hhc2UgIGBjaGVxdWU6YCBEb2N1bWVudCBvcmRlcmluZyB0aGUgcGF5bWVudCBvZiBtb25leSB0byBhbm90aGVyIHBlcnNvbiBvciBvcmdhbml6YXRpb24gIGBkaXJlY3QgZGViaXQ6YCBBdXRvbWF0aWMgd2l0aGRyYXdhbCBvZiBmdW5kcyBpbml0aWF0ZWQgYnkgYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGBpbnRlcmVzdDpgIEludGVyZXN0IGVhcm5lZCBvciBpbmN1cnJlZCAgYHB1cmNoYXNlOmAgUHVyY2hhc2UgbWFkZSB3aXRoIGEgZGViaXQgb3IgY3JlZGl0IGNhcmQgIGBzdGFuZGluZyBvcmRlcjpgIFBheW1lbnQgaW5zdHJ1Y3RlZCBieSB0aGUgYWNjb3VudCBob2xkZXIgdG8gYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGB0cmFuc2ZlcjpgIFRyYW5zZmVyIG9mIG1vbmV5IGJldHdlZW4gYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQ29kZSB7XG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBdG0gPSAnYXRtJyxcbiAgICBCYW5rQ2hhcmdlID0gJ2JhbmsgY2hhcmdlJyxcbiAgICBCaWxsUGF5bWVudCA9ICdiaWxsIHBheW1lbnQnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgQ2FzaGJhY2sgPSAnY2FzaGJhY2snLFxuICAgIENoZXF1ZSA9ICdjaGVxdWUnLFxuICAgIERpcmVjdERlYml0ID0gJ2RpcmVjdCBkZWJpdCcsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIFB1cmNoYXNlID0gJ3B1cmNoYXNlJyxcbiAgICBTdGFuZGluZ09yZGVyID0gJ3N0YW5kaW5nIG9yZGVyJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHR5cGU6IENvdW50ZXJwYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoZWQgZGlyZWN0IGRlcG9zaXQgdHJhbnNhY3Rpb24gdXNlZCB0byB2ZXJpZnkgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSB0byBwb3B1bGF0ZSBhcyB0ZXN0IHRyYW5zYWN0aW9uIGRhdGEuIElmIG5vdCBzcGVjaWZpZWQsIHJhbmRvbSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gVHJhbnNhY3Rpb25zIGluIFNhbmRib3ggd2lsbCBtb3ZlIGZyb20gcGVuZGluZyB0byBwb3N0ZWQgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBkYXRlIGhhcyBiZWVuIHJlYWNoZWQuIElmIGEgYGRhdGVfdHJhbnNhY3RlZGAgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgYSB0cmFuc2FjdGlvbiBkYXRlIG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIFtgYXV0aG9yaXplZF9kYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnMtZ2V0LXJlc3BvbnNlLXRyYW5zYWN0aW9ucy1hdXRob3JpemVkLWRhdGUpIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBQb3N0ZWQgZGF0ZXMgaW4gdGhlIHBhc3Qgb3IgcHJlc2VudCB3aWxsIHJlc3VsdCBpbiBwb3N0ZWQgdHJhbnNhY3Rpb25zOyBwb3N0ZWQgZGF0ZXMgaW4gdGhlIGZ1dHVyZSB3aWxsIHJlc3VsdCBpbiBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LiBDYW4gYmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgZm9ybWF0IGN1cnJlbmN5IGNvZGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgcmVsYXRlZCB0cmFuc2FjdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBzdHJlYW0gYmVsb25nc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAuIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24gYW5kIGdyZWF0ZXIgYWNjdXJhY3kuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZpcnN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbGFzdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbW9kaWZpZWQgYnkgcmVxdWVzdCB0byBhIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zYCBlbmRwb2ludC4gSXQgd2lsbCBiZSBgZmFsc2VgIGZvciBhbGwgb3RoZXIgc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc191c2VyX21vZGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB1c2VyIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIGBpc191c2VyX21vZGlmaWVkYCBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBydWxlIGNyZWF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBJdGVtIHRoZSBydWxlIHdhcyBjcmVhdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHJ1bGUgd2FzIGNyZWF0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdW5pcXVlIGlkZW50aWZpZXIuICBJbiB0aGUgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSB0YXhvbm9teSwgdGhpcyBmaWVsZCBpcyByZXByZXNlbnRlZCBieSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBydWxlX2RldGFpbHM/OiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChgZGVwb3NpdG9yeWAgb3IgYGNyZWRpdGApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcmF3IHRyYW5zYWN0aW9ucyB0byBiZSBlbmhhbmNlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBlbmhhbmNlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuaGFuY2VkX3RyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChlaXRoZXIgYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb24gb2JqZWN0cyB0byBiZSBlbnJpY2hlZCBieSBQbGFpZC4gTWF4aW11bSBvZiAxMDAgdHJhbnNhY3Rpb25zIHBlciByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYGxlZ2FjeV9jYXRlZ29yeWAgYW5kIGBsZWdhY3lfY2F0ZWdvcnlfaWRgIGluIHRoZSByZXNwb25zZSAoaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgKS4gIENhdGVnb3JpZXMgYXJlIGJhc2VkIG9uIFBsYWlkXFwncyBsZWdhY3kgdGF4b25vbXkuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xlZ2FjeV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVucmljaGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnJpY2hlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgZmllbGQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgcGFyc2VkIGRhdGEgcHJvdmlkZWQsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIsIG9yIHN1Ym1pdCBhIFtTdXBwb3J0IHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9wcm9kdWN0LWZ1bmN0aW9uYWxpdHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB0aGF0IHdlcmUgbm90IGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIGR1cmluZyBMaW5rIGFuZCBhcmUgbm93IGFkZGluZyB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgdG8gdGhlIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcHRpb24gY29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IFBsYWlkIHdpbGwgcmVxdWVzdCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBhZnRlciBEZWNlbWJlciAzLCAyMDIzLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBvbiBEZWNlbWJlciAzLCAyMDIzIG9yIGVhcmxpZXIsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gNzMwIGRheXMgdW50aWwgSnVuZSAyNCwgMjAyNCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuICBJZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBwcmlvciB0byB0aGlzIGNhbGwsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB1dGlsaXppbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYGFjY291bnRzYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIHRyYW5zYWN0aW9ucyBhcmUgYmVpbmcgcmV0dXJuZWQuIEVhY2ggdHJhbnNhY3Rpb24gY2FuIGJlIG1hcHBlZCB0byBpdHMgY29ycmVzcG9uZGluZyBhY2NvdW50IHZpYSB0aGUgYGFjY291bnRfaWRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQgZGVmaW5lcyBhIHNpbmdsZSBpbnB1dCB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvY3JlYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvY3JlYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogT3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM/OiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSURzIG9mIGFsbCB0aGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGZpcnN0IHN0cmVhbS4gVGhpcyBvcGVyYXRpb24gd2lsbCByZXRhaW4gdGhlIHN0cmVhbV9pZCBvZiB0aGUgZmlyc3Qgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0XG4gICAgICovXG4gICAgc3RyZWFtX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0IGRlZmluZWQgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCB0aGUgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuIFRoaXMgd2lsbCBlaXRoZXIgYWxsIHN1Y2NlZWQgb3IgYWxsIGZhaWwuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXQ+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZF9zdHJlYW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0cmFuc2FjdGlvbnMgcnVsZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBkZXRhaWxlZCBjYXRlZ29yeS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoaXMgZmllbGQgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgYW5kIGFjY3VyYXRlIGNhdGVnb3JpemF0aW9uLiAgU2VlIHRoZSBbYHRheG9ub215IGNzdiBmaWxlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzOiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGU6IFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb24gcnVsZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlczogQXJyYXk8VHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFByb3ZpZGluZyBpdCB3aWxsIGNhdXNlIHRoZSByZXNwb25zZSB0byBvbmx5IHJldHVybiBjaGFuZ2VzIGFmdGVyIHRoaXMgdXBkYXRlLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgdXBkYXRlcyB3aWxsIGJlIHJldHVybmVkLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdC1hZGRlZCB0cmFuc2FjdGlvbnMgb24gdGhlIEl0ZW0uIFRoZSBjdXJzb3IgYWxzbyBhY2NlcHRzIHRoZSBzcGVjaWFsIHZhbHVlIG9mIGBcXFwibm93XFxcImAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZhc3QtZm9yd2FyZCB0aGUgY3Vyc29yIGFzIHBhcnQgb2YgbWlncmF0aW5nIGFuIGV4aXN0aW5nIEl0ZW0gZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIHN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiBOb3RlIHRoYXQgdXNpbmcgdGhlIGBcXFwibm93XFxcImAgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IHVzZSBjYXNlIG90aGVyIHRoYW4gbWlncmF0aW5nIGV4aXN0aW5nIEl0ZW1zIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIFRoZSB1cHBlci1ib3VuZCBsZW5ndGggb2YgdGhpcyBjdXJzb3IgaXMgMjU2IGNoYXJhY3RlcnMgb2YgYmFzZTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciBvciBzdWJtaXQgYSBbU3VwcG9ydCByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcHJvZHVjdC1mdW5jdGlvbmFsaXR5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgdG8gY2FsbHMgZm9yIEl0ZW1zIHRoYXQgd2VyZSBub3QgaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgZHVyaW5nIExpbmsgYW5kIGFyZSBub3cgYWRkaW5nIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCB0byB0aGUgSXRlbSBmb3IgdGhlIGZpcnN0IHRpbWUuIEluIHRoZXNlIGNhc2VzLCB0aGlzIG9wdGlvbiBjb250cm9scyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRoYXQgUGxhaWQgd2lsbCByZXF1ZXN0IGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIGFmdGVyIERlY2VtYmVyIDMsIDIwMjMsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIG9uIERlY2VtYmVyIDMsIDIwMjMgb3IgZWFybGllciwgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA3MzAgZGF5cyB1bnRpbCBKdW5lIDI0LCAyMDI0LCBhdCB3aGljaCBwb2ludCBpdCB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gIElmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHByaW9yIHRvIHRoaXMgY2FsbCwgdGhpcyBmaWVsZCB3aWxsIGhhdmUgbm8gZWZmZWN0LiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgY3VzdG9tZXJzIHV0aWxpemluZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb24gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLiBUaGUgY3Vyc29yIG9idGFpbmVkIGFmdGVyIGFsbCBwYWdlcyBoYXZlIGJlZW4gcHVsbGVkIChpbmRpY2F0ZWQgYnkgYGhhc19tb3JlYCBiZWluZyBgZmFsc2VgKSB3aWxsIGJlIHZhbGlkIGZvciBhdCBsZWFzdCAxIHllYXIuIFRoaXMgY3Vyc29yIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIGxhdGVyIGNhbGxzLiBJZiB0cmFuc2FjdGlvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiBtb3JlIHRoYW4gcmVxdWVzdGVkIGNvdW50IG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgZXhpc3QuIElmIHRydWUsIHRoZSBhZGRpdGlvbmFsIHVwZGF0ZXMgY2FuIGJlIGZldGNoZWQgYnkgbWFraW5nIGFuIGFkZGl0aW9uYWwgcmVxdWVzdCB3aXRoIGBjdXJzb3JgIHNldCB0byBgbmV4dF9jdXJzb3JgLiBJZiBgaGFzX21vcmVgIGlzIHRydWUsIGl04oCZcyBpbXBvcnRhbnQgdG8gcHVsbCBhbGwgYXZhaWxhYmxlIHBhZ2VzLCB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IGZvciB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlcyB0byBjb25mbGljdCB3aXRoIHBhZ2luYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgY2xpZW50LXByb3ZpZGVkIHVzZXJfaWQgdG8gcmV0cmlldmUgaW5zaWdodHMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckRhdGFPdmVydmlld31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2RhdGFfb3ZlcnZpZXc6IFVzZXJEYXRhT3ZlcnZpZXc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9pbnNpZ2h0cz86IENvdW50ZXJwYXJ0eUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXRlZ29yeUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3J5X2luc2lnaHRzPzogQ2F0ZWdvcnlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2FjdGlvbnM/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbnM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiB0aGUgZnVsbCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIHNldHRsZXMgYXQgdGhlIGNvbnN1bWVyc+KAmSBhY2NvdW50LCBpZiB0aGUgdHJhbnNmZXIgaXMgY3JlZGl0OyBvciBhdCB0aGUgY3VzdG9tZXJcXCdzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQsIGlmIHRoZSB0cmFuc2ZlciBpcyBkZWJpdC4gT25seSBzZXQgZm9yIEFDSCB0cmFuc2ZlcnMgYW5kIGlzIG51bGwgZm9yIG5vbi1BQ0ggdHJhbnNmZXJzLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIEFDSCBuZXR3b3JrcyB1c2VkIGZvciB0aGUgZnVuZHMgZmxvdy4gIEZvciByZXF1ZXN0cyBzdWJtaXR0ZWQgYXMgZWl0aGVyIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRoZSBjdXRvZmYgZm9yIHNhbWUtZGF5IGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lIGFuZCB0aGUgY3V0b2ZmIGZvciBuZXh0LWRheSB0cmFuc2ZlcnMgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHN1Ym1pdCBhIHJlcXVlc3QgYXQgbGVhc3QgMTUgbWludXRlcyBiZWZvcmUgdGhlIGN1dG9mZiB0aW1lIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgY3V0b2ZmLiBBbnkgcmVxdWVzdCB0aGF0IGlzIGluZGljYXRlZCBhcyBgc2FtZS1kYXktYWNoYCBhbmQgdGhhdCBtaXNzZXMgdGhlIHNhbWUtZGF5IGN1dG9mZiwgYnV0IGlzIHN1Ym1pdHRlZCBpbiB0aW1lIGZvciB0aGUgbmV4dC1kYXkgY3V0b2ZmLCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQUNITmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gZm9yIGEgcHJvcG9zZWQgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgcmVwcmVzZW50aW5nIHdoZW4gdGhlIGF1dGhvcml6YXRpb24gd2FzIGNyZWF0ZWQsIGluIHRoZSBmb3JtYXQgYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrOiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmVxdWlyZWQgaWYgbm90IHVzaW5nIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgYXV0aG9yaXphdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGF1dGhvcml6YXRpb24sIHdoaWNoIGV4cGlyZXMgYWZ0ZXIgNDggaG91cnMuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYW4gYXV0aG9yaXphdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBhdXRob3JpemF0aW9uIGlzIGNyZWF0ZWQuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2l0aF9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgUGxhaWRcXCdzIFtiZWFjb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvZ3VhcmFudGVlLyN1c2luZy1hLWJlYWNvbikgd2hlbiBpdCBpcyBydW4gb24geW91ciB3ZWJwYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgbmVlZGVkIGlmIGNyZWF0aW5nIHRyYW5zZmVycyBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZT86IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgYXV0aG9yaXphdGlvbmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogIEEgZGVjaXNpb24gcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIGBhcHByb3ZlZGAg4oCTIFRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgcmVjZWl2ZWQgdGhlIGVuZCB1c2VyXFwncyBjb25zZW50IGFuZCBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgcHJvY2Vzc2luZyBieSBQbGFpZC4gVGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkIGlzIHNldCBpZiBQbGFpZCB3YXMgdW5hYmxlIHRvIGZldGNoIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uLiBZb3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBmdXJ0aGVyIHJldmlldyBpcyByZWNvbW1lbmRlZCAoaS5lLiwgdXNlIExpbmsgaW4gdXBkYXRlIHRvIHJlLWF1dGhlbnRpY2F0ZSB5b3VyIHVzZXIgd2hlbiBgZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCkuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZWNsaW5lZCA9ICdkZWNsaW5lZCdcbn1cblxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gcmVnYXJkaW5nIGEgcHJvcG9zZWQgdHJhbnNmZXIuIEl0IGlzIGFsd2F5cyBzZXQgZm9yIGBkZWNsaW5lZGAgZGVjaXNpb25zLCBhbmQgbWF5IG9yIG1heSBub3QgYmUgbnVsbCBmb3IgYGFwcHJvdmVkYCBkZWNpc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgdHJhbnNmZXIgYXBwcm92YWwgb3IgdHJhbnNmZXIgZGVjbGluZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJhdGlvbmFsZSBmb3IgYXBwcm92aW5nIG9yIGRlY2xpbmluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBJZiB0aGUgYHJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBwYXNzZWQgdGhlIGF1dGhvcml6YXRpb24gY2hlY2suICBBbnkgbm9uLWBudWxsYCB2YWx1ZSBmb3IgYW4gYGFwcHJvdmVkYCB0cmFuc2ZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgdGhlIGF1dGhvcml6YXRpb24gY2hlY2sgY291bGQgbm90IGJlIHJ1biBhbmQgdGhhdCB5b3Ugc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBhc3Nlc3NtZW50IG9uIHRoZSB0cmFuc2Zlci4gVGhlIGNvZGUgd2lsbCBpbmRpY2F0ZSB3aHkgdGhlIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4uIFBvc3NpYmxlIHZhbHVlcyBmb3IgYW4gYGFwcHJvdmVkYCB0cmFuc2ZlciBhcmU6ICBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAg4oCTIEl0ZW0gY3JlYXRlZCB2aWEgc2FtZS1kYXkgbWljcm8gZGVwb3NpdHMsIGxpbWl0ZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgYElURU1fTE9HSU5fUkVRVUlSRURgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gSXRlbSBzdGFsZW5lc3MuIENhbiBiZSByZXNvbHZlZCBieSB1c2luZyBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBgTUlHUkFURURfQUNDT1VOVF9JVEVNYCAtIEl0ZW0gY3JlYXRlZCB2aWEgYC90cmFuc2Zlci9hY2NvdW50X21pZ3JhdGlvbmAgZW5kcG9pbnQsIGxpbWl0ZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgYEVSUk9SYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIGFuIHVuc3BlY2lmaWVkIGVycm9yLiAgVGhlIGZvbGxvd2luZyBjb2RlcyBpbmRpY2F0ZSB0aGF0IHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9uIHdhcyBgZGVjbGluZWRgOiAgYE5TRmAg4oCTIFRyYW5zYWN0aW9uIGxpa2VseSB0byByZXN1bHQgaW4gYSByZXR1cm4gZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBSSVNLYCAtIFRyYW5zYWN0aW9uIGlzIGhpZ2gtcmlzay4gIGBUUkFOU0ZFUl9MSU1JVF9SRUFDSEVEYCAtIE9uZSBvciBzZXZlcmFsIHRyYW5zZmVyIGxpbWl0cyBhcmUgcmVhY2hlZCwgZS5nLiBtb250aGx5IHRyYW5zZmVyIGxpbWl0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBOc2YgPSAnTlNGJyxcbiAgICBSaXNrID0gJ1JJU0snLFxuICAgIFRyYW5zZmVyTGltaXRSZWFjaGVkID0gJ1RSQU5TRkVSX0xJTUlUX1JFQUNIRUQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWRJdGVtID0gJ01BTlVBTExZX1ZFUklGSUVEX0lURU0nLFxuICAgIEl0ZW1Mb2dpblJlcXVpcmVkID0gJ0lURU1fTE9HSU5fUkVRVUlSRUQnLFxuICAgIFBheW1lbnRQcm9maWxlTG9naW5SZXF1aXJlZCA9ICdQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRUQnLFxuICAgIEVycm9yID0gJ0VSUk9SJyxcbiAgICBNaWdyYXRlZEFjY291bnRJdGVtID0gJ01JR1JBVEVEX0FDQ09VTlRfSVRFTScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi4gVGhlc2UgZmllbGRzIGFyZSBub3QgY3VycmVudGx5IGluY29ycG9yYXRlZCBpbnRvIHRoZSByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICB1c2VyX2FnZW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNmZXIgaXMgZ3VhcmFudGVlZCBieSBQbGFpZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS4gVGhpcyBmaWVsZCB3aWxsIGNvbnRhaW4gZWl0aGVyIGBHVUFSQU5URUVEYCBvciBgTk9UX0dVQVJBTlRFRURgIGluZGljYXRpbmcgd2hldGhlciBQbGFpZCB3aWxsIGd1YXJhbnRlZSB0aGUgdHJhbnNmZXIuIElmIHRoZSB0cmFuc2ZlciBpcyBub3QgZ3VhcmFudGVlZCwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGluIHRoZSBgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZWAgZmllbGQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gYGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGVgIGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24ge1xuICAgIEd1YXJhbnRlZWQgPSAnR1VBUkFOVEVFRCcsXG4gICAgTm90R3VhcmFudGVlZCA9ICdOT1RfR1VBUkFOVEVFRCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSByYXRpb25hbGUgZm9yIFBsYWlkXFwncyBkZWNpc2lvbiB0byBub3QgZ3VhcmFudGVlIGEgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIHVubGVzcyBgZ3VhcmFudGVlX2RlY2lzaW9uYCBpcyBgTk9UX0dVQVJBTlRFRURgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgdHJhbnNmZXIgY2Fubm90IGJlIGd1YXJhbnRlZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByZWFzb24gUGxhaWQgZGVjbGluZWQgdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXI6ICBgUkVUVVJOX0JBTktgOiBUaGUgcmlzayBvZiBhIGJhbmstaW5pdGlhdGVkIHJldHVybiAoZm9yIGV4YW1wbGUsIGFuIFIwMS9OU0YpIGlzIHRvbyBoaWdoIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyLiAgYFJFVFVSTl9DVVNUT01FUmA6IFRoZSByaXNrIG9mIGEgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiAoZm9yIGV4YW1wbGUsIGEgUjEwL1VuYXV0aG9yaXplZCkgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgR1VBUkFOVEVFX0xJTUlUX1JFQUNIRURgOiBUaGlzIHRyYW5zZmVyIGlzIGxvdy1yaXNrLCBidXQgR3VhcmFudGVlIGhhcyBleGhhdXN0ZWQgYW4gaW50ZXJuYWwgbGltaXQgb24gdGhlIG51bWJlciBvciByYXRlIG9mIGd1YXJhbnRlZXMgdGhhdCBhcHBsaWVzIHRvIHRoaXMgdHJhbnNmZXIuICBgUklTS19FU1RJTUFURV9VTkFWQUlMQUJMRWA6IEEgcmlzayBlc3RpbWF0ZSBpcyB1bmF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLiAgYFJFUVVJUkVEX1BBUkFNX01JU1NJTkdgOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIFJldHVybkJhbmsgPSAnUkVUVVJOX0JBTksnLFxuICAgIFJldHVybkN1c3RvbWVyID0gJ1JFVFVSTl9DVVNUT01FUicsXG4gICAgR3VhcmFudGVlTGltaXRSZWFjaGVkID0gJ0dVQVJBTlRFRV9MSU1JVF9SRUFDSEVEJyxcbiAgICBSaXNrRXN0aW1hdGVVbmF2YWlsYWJsZSA9ICdSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFJyxcbiAgICBSZXF1aXJlZFBhcmFtTWlzc2luZyA9ICdSRVFVSVJFRF9QQVJBTV9NSVNTSU5HJ1xufVxuXG4vKipcbiAqIFRoaXMgb2JqZWN0IGluY2x1ZGVzIHRoZSBzY29yZXMgYW5kIHJpc2sgbGV2ZWwuIFRoaXMgcmVzcG9uc2UgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGVzZSBmaWVsZHMgcGxlYXNlIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwMVxcXCIsIFxcXCJSMDJcXFwiLCBcXFwiUjAzXFxcIiwgXFxcIlIwNFxcXCIsIFxcXCJSMDZcXFwiLCBcXFwiUjA4XFxcIiwgIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9zY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuICBUaGUgc2NvcmUgZXZhbHVhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBvZiBhbiB1bmF1dGhvcml6ZWQgZGViaXQgYW5kIGNvdmVycyByZXR1cm4gY29kZXM6IFxcXCJSMDVcXFwiLCBcXFwiUjA3XFxcIiwgXFxcIlIxMFxcXCIsIFxcXCJSMTFcXFwiLCBcXFwiUjI5XFxcIi4gVGhlc2UgcmV0dXJucyB0eXBpY2FsbHkgaGF2ZSBhIHJldHVybiB0aW1lIGZyYW1lIG9mIHVwIHRvIDYwIGNhbGVuZGFyIGRheXMuIER1cmluZyB0aGlzIHBlcmlvZCwgdGhlIGN1c3RvbWVyIG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY2FuIGRpc3B1dGUgYSB0cmFuc2FjdGlvbiBhcyB1bmF1dGhvcml6ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgcmlza19sZXZlbDogVHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBtb2RlbCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBTaWduYWwgc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyB0cmFuc2Zlci4gT25seSBwcmVzZW50IGlmIGNyZWF0ZWQgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbn1cbi8qKlxuICogQ29tcHJpc2VzIGZpdmUgcmlzayBjYXRlZ29yaWVzIChoaWdoIHJpc2ssIG1lZGl1bS1oaWdoIHJpc2ssIG1lZGl1bSByaXNrLCBtZWRpdW0tbG93IHJpc2ssIGxvdyByaXNrKSBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgcmV0dXJuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwge1xuICAgIEhpZ2hSaXNrID0gJ0hJR0hfUklTSycsXG4gICAgTWVkaXVtSGlnaFJpc2sgPSAnTUVESVVNX0hJR0hfUklTSycsXG4gICAgTWVkaXVtUmlzayA9ICdNRURJVU1fUklTSycsXG4gICAgTWVkaXVtTG93UmlzayA9ICdNRURJVU1fTE9XX1JJU0snLFxuICAgIExvd1Jpc2sgPSAnTE9XX1JJU0snXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuIFRoZSBgdXNlci5sZWdhbF9uYW1lYCBmaWVsZCBpcyByZXF1aXJlZC4gT3RoZXIgZmllbGRzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYW5kIGFyZSBwcmVzZW50IHRvIHN1cHBvcnQgcGxhbm5lZCBmdXR1cmUgZnVuY3Rpb25hbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYWxhbmNlLiAgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFlvdXIgcHJlZnVuZGVkIEFDSCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckJhbGFuY2VUeXBlIHtcbiAgICBSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgc2VydmljZSB0eXBlcyBpbiBSVFBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFBcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24gc3VwcG9ydHMgUlRQIGNyZWRpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFBcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gYGF1dGhvcml6YXRpb25faWRgIGlzIG5vdyB1c2VkIGFzIGlkZW1wb3RlbmN5IGluc3RlYWQuICBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBUaGlzIHBhcmFtZXRlciBhbHNvIHNlcnZlcyB0aGUgcHVycG9zZSBvZiBhY3RpbmcgYXMgYW4gaWRlbXBvdGVuY3kgaWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0eXBlPzogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTUgY2hhcmFjdGVycy4gSWYgcmVwcm9jZXNzaW5nIGEgcmV0dXJuZWQgdHJhbnNmZXIsIHBsZWFzZSBub3RlIHRoYXQgdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQgbXVzdCBiZSBgXFxcIlJldHJ5IDFcXFwiYCBvciBgXFxcIlJldHJ5IDJcXFwiYCB0byBpbmRpY2F0ZSB0aGF0IGl0XFwncyBhIHJldHJ5IG9mIGEgcHJldmlvdXNseSByZXR1cm5lZCB0cmFuc2Zlci4gWW91IG1heSByZXRyeSBhIHRyYW5zZmVyIHVwIHRvIDIgdGltZXMsIHdpdGhpbiAxODAgZGF5cyBvZiBjcmVhdGluZyB0aGUgb3JpZ2luYWwgdHJhbnNmZXIuIE9ubHkgdHJhbnNmZXJzIHRoYXQgd2VyZSByZXR1cm5lZCB3aXRoIGNvZGUgYFIwMWAgb3IgYFIwOWAgbWF5IGJlIHJldHJpZWQuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVzZXI/OiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgdHJhbnNmZXJgIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBkZWR1Y3QgZnJvbSBgdHJhbnNmZXIuYW1vdW50YCBhbmQgZGlzdHJpYnV0ZSB0byB0aGUgcGxhdGZvcm3igJlzIExlZGdlciBiYWxhbmNlIGFzIGEgZmFjaWxpdGF0b3IgZmVlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoZSByZW1haW5kZXIgd2lsbCBnbyB0byB0aGUgZW5kLWN1c3RvbWVy4oCZcyBMZWRnZXIgYmFsYW5jZS4gVGhpcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFjaWxpdGF0b3JfZmVlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIG5vdyBkZXByZWNhdGVkLiBZb3UgbWF5IGlnbm9yZSBpdCBmb3IgdHJhbnNmZXJzIGNyZWF0ZWQgb24gYW5kIGFmdGVyIDEyLzAxLzIwMjMuICBTcGVjaWZpZXMgdGhlIHNvdXJjZSBvZiBmdW5kcyBmb3IgdGhlIHRyYW5zZmVyLiBPbmx5IHZhbGlkIGZvciBgY3JlZGl0YCB0cmFuc2ZlcnMsIGFuZCBkZWZhdWx0cyB0byBgc3dlZXBgIGlmIG5vdCBzcGVjaWZpZWQuIFRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCBmb3IgYGRlYml0YCB0cmFuc2ZlcnMuICBgc3dlZXBgIC0gU3dlZXAgZnVuZHMgZnJvbSB5b3VyIGZ1bmRpbmcgYWNjb3VudCBgcHJlZnVuZGVkX3J0cF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZSB7XG4gICAgU3dlZXAgPSAnc3dlZXAnLFxuICAgIFByZWZ1bmRlZFJ0cENyZWRpdHMgPSAncHJlZnVuZGVkX3J0cF9jcmVkaXRzJyxcbiAgICBQcmVmdW5kZWRBY2hDcmVkaXRzID0gJ3ByZWZ1bmRlZF9hY2hfY3JlZGl0cycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgY3JlZGl0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBjcmVkaXQgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGNyZWRpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2F2ZXJhZ2VfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIG1vbnRobHkgZXhwZWN0ZWQgQUNIIGNyZWRpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvcuKAmXMgY3JlZGl0IHRyYW5zZmVycy4gVGhpcyBzaG91bGQgYmUgYSBsaXN0IHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlczogIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGUuZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHNlY19jb2RlczogQXJyYXk8Q3JlZGl0QUNIQ2xhc3M+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGRlYml0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBkZWJpdCB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBkZWJpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGRlYml0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBkZWJpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBkZWJpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEZXZpY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBDbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3Igd2hvc2UgZG9jdW1lbnQgdGhhdCB5b3Ugd2FudCB0byB1cGxvYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZmlsZSB0byB1cGxvYWQuIFRoZSBmaWxlIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gMjBNQi4gU3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uczogLnBkZi5cbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGZpbGU6IGFueTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEb2N1bWVudFB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgcHVycG9zZTogVHJhbnNmZXJEb2N1bWVudFB1cnBvc2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3LigJlzIGRpbGlnZW5jZSBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRpbGlnZW5jZVN0YXR1cyB7XG4gICAgTm90U3VibWl0dGVkID0gJ25vdF9zdWJtaXR0ZWQnLFxuICAgIFN1Ym1pdHRlZCA9ICdzdWJtaXR0ZWQnLFxuICAgIFVuZGVyUmV2aWV3ID0gJ3VuZGVyX3JldmlldycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlbmllZCA9ICdkZW5pZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSB0aGUgb3JpZ2luYXRvciB3aG9zZSBkaWxpZ2VuY2UgdGhhdCB5b3Ugd2FudCB0byBzdWJtaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2RpbGlnZW5jZTogVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIHVwbG9hZGVkIGZpbGUuICBgXFxcIkRVRV9ESUxJR0VOQ0VcXFwiYCAtIFRoZSB0cmFuc2ZlciBkdWUgZGlsaWdlbmNlIGRvY3VtZW50IG9mIHRoZSBvcmlnaW5hdG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEb2N1bWVudFB1cnBvc2Uge1xuICAgIER1ZURpbGlnZW5jZSA9ICdEVUVfRElMSUdFTkNFJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IFRyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgb21pdHRlZCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgYG51bGxgIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09taXR0YWJsZVRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBPbWl0dGFibGVUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaWduZWQgYW1vdW50IG9mIGhvdyBtdWNoIHdhcyBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgIGZvciB0aGlzIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIi01LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2Ftb3VudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLiBBIG5vbi1udWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZXZlbnQgaXMgZm9yIHRoZSBhc3NvY2lhdGVkIHJlZnVuZCBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIHRyYW5zZmVyIHRoYXQgdGhpcyBldmVudCBhcHBsaWVzIHRvLiBPbmx5IHByZXNlbnQgaWYgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PFRyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhZnRlcl9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgdHJhbnNmZXIgcmVwcmVzZW50cy4gRXZlbnQgdHlwZXMgd2l0aCBwcmVmaXggYHN3ZWVwYCByZXByZXNlbnRzIGV2ZW50cyBmb3IgUGxhaWQgTGVkZ2VyIHN3ZWVwcy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHNldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuICBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuICBgc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHN3ZXB0IHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiAgYHJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgdHJhbnNmZXIgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVsbGVkIGZyb20gb3IgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlZXAucGVuZGluZ2A6IEEgbmV3IGxlZGdlciBzd2VlcCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgc3dlZXAucG9zdGVkYDogVGhlIGxlZGdlciBzd2VlcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgc3dlZXAuc2V0dGxlZGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgZnVuZGluZyBhY2NvdW50LiBUaGlzIG1lYW5zIHRoYXQgZnVuZHMgd2l0aGRyYXduIGZyb20gUGxhaWQgTGVkZ2VyIGJhbGFuY2UgaGF2ZSByZWFjaGVkIHRoZSBmdW5kaW5nIGFjY291bnQsIG9yIGZ1bmRzIHRvIGJlIGRlcG9zaXRlZCBpbnRvIHRoZSBQbGFpZCBMZWRnZXIgQmFsYW5jZSBoYXZlIGJlZW4gcHVsbGVkLCBhbmQgdGhlIGhvbGQgcGVyaW9kIGhhcyBiZWd1bi4gIGBzd2VlcC5yZXR1cm5lZGA6IEEgcG9zdGVkIGxlZGdlciBzd2VlcCB3YXMgcmV0dXJuZWQuICBgc3dlZXAuZmFpbGVkYDogVGhlIGxlZGdlciBzd2VlcCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcmVmdW5kLnBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHJlZnVuZC5jYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQuICBgcmVmdW5kLmZhaWxlZGA6IFRoZSByZWZ1bmQgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZWZ1bmQuc2V0dGxlZGA6IFRoZSByZWZ1bmQgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5lZGA6IEEgcG9zdGVkIHJlZnVuZCB3YXMgcmV0dXJuZWQuICBgcmVmdW5kLnN3ZXB0YDogVGhlIHJlZnVuZCB3YXMgc3dlcHQgZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuX3N3ZXB0YDogRHVlIHRvIHRoZSByZWZ1bmQgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgU3dlZXBQZW5kaW5nID0gJ3N3ZWVwLnBlbmRpbmcnLFxuICAgIFN3ZWVwUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU3dlZXBTZXR0bGVkID0gJ3N3ZWVwLnNldHRsZWQnLFxuICAgIFN3ZWVwUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIFN3ZWVwRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgYW4gZXhwZWN0ZWQgc3dlZXAgZGF0ZSBhbmQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZW1lbnQgZGF0ZSBvZiBhIHN3ZWVwIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VlcF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjdW11bGF0ZWQgYW1vdW50IHRoYXQgaGFzIGJlZW4gc3dlcHQgYnkgYHN3ZWVwX3NldHRsZW1lbnRfZGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIHN3ZXB0X3NldHRsZWRfYW1vdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXR1cm5lZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGZ1bmRpbmcgYWNjb3VudCwgbGlua2VkIHdpdGggUGxhaWQgTGluayBvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgQVBQUk9WRURgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgREVDTElORURgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50QXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmV0dXJuZWQgb25seSBpZiBgYWNjb3VudF9pZGAgd2FzIHNldCBvbiBpbnRlbnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdyBvZiB0cmFuc2ZlciBmdW5kcy4gIGBQQVlNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQgdG8geW91ciBidXNpbmVzcyBhY2NvdW50LiAgYERJU0JVUlNFTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIHlvdXIgYnVzaW5lc3MgYWNjb3VudCB0byBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZSB7XG4gICAgUGF5bWVudCA9ICdQQVlNRU5UJyxcbiAgICBEaXNidXJzZW1lbnQgPSAnRElTQlVSU0VNRU5UJ1xufVxuXG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gRGVmYXVsdHMgdG8gYHNhbWUtZGF5LWFjaGAuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA1OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50Q3JlYXRlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIGludGVudCBzdGF0dXMgaXMgYGZhaWxlZGAuIE51bGwgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQgKGkuZS4sIGFuIEFQSSBlcnJvciBvciB0aGUgYXV0aG9yaXphdGlvbiBiZWluZyBkZWNsaW5lZCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEdldH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudDogVHJhbnNmZXJJbnRlbnRHZXQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIGludGVudC4gIGBQRU5ESU5HYDogVGhlIHRyYW5zZmVyIGludGVudCBpcyBwZW5kaW5nLiBgU1VDQ0VFREVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIGBGQUlMRURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyB1bmFibGUgdG8gYmUgY3JlYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50U3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFN1Y2NlZWRlZCA9ICdTVUNDRUVERUQnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHBlbmRpbmcgZnVuZHMgdGhhdCBhcmUgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW914oCZcmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IGxpbmtlZCB0byB0aGlzIFBsYWlkIExlZGdlciB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIElmIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAgaXMgc3BlY2lmaWVkLCB0aGUgYGZ1bmRpbmdfYWNjb3VudF9pZGAgbXVzdCBiZWxvbmcgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yLCBhbmQgaWYgYGZ1bmRpbmdfYWNjb3VudF9pZGAgaXMgbGVmdCBibGFuaywgdGhlIG9yaWdpbmF0b3JcXCdzIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgZGVwb3NpdGVkIGludG8gbGVkZ2VyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRlcG9zaXQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGVwb3NpdCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkZXBvc2l0IGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckFDSE5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2ZlckFDSE5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgdG8gcHVsbCBtb25leSBmcm9tLiBNdXN0IGJlIHRoZSBwbGF0Zm9ybSBpdHNlbGYgb3IgaXRzIG9yaWdpbmF0b3IuIE9uZSBvZiBgZnJvbV9jbGllbnRfaWRgIGFuZCBgdG9fY2xpZW50X2lkYCBtdXN0IGJlIHRoZSBwbGF0Zm9ybVxcJ3MgYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCB0byBjcmVkaXQgbW9uZXkgdG8uIE11c3QgYmUgdGhlIHBsYXRmb3JtIGl0c2VsZiBvciBpdHMgb3JpZ2luYXRvci4gT25lIG9mIGBmcm9tX2NsaWVudF9pZGAgYW5kIGB0b19jbGllbnRfaWRgIG11c3QgYmUgdGhlIHBsYXRmb3JtXFwncyBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgdG9fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBtb3ZlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIEFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGlzdHJpYnV0ZS4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkaXN0cmlidXRlIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRpc3RyaWJ1dGUgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBsZWRnZXIgZGlzdHJpYnV0ZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckxlZGdlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBsZWRnZXIgc3dlZXAgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAucG9zdGVkYCAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAuZmFpbGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5zZXR0bGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgIGBzd2VlcC5zZXR0bGVkYCAtLT4gYHN3ZWVwLnJldHVybmVkYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZSB7XG4gICAgUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBjdXN0b21lciB0aGF0IG93bnMgdGhlIExlZGdlciBiYWxhbmNlLiBUaGlzIGlzIHNvIFBsYWlkIGtub3dzIHdoaWNoIG9mIHlvdXIgY3VzdG9tZXJzIHRvIHBheW91dCBvciBjb2xsZWN0IGZ1bmRzLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtQbGF0Zm9ybSBjdXN0b21lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuIERvIG5vdCBpbmNsdWRlIGlmIHlvdeKAmXJlIHBheWluZyBvdXQgdG8geW91cnNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBmdW5kaW5nIGFjY291bnQgbGlua2VkIHRvIHRoaXMgUGxhaWQgTGVkZ2VyIHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IsIGFuZCBpZiBgZnVuZGluZ19hY2NvdW50X2lkYCBpcyBsZWZ0IGJsYW5rLCB0aGUgb3JpZ2luYXRvclxcJ3MgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlciBiYWxhbmNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgd2l0aGRyYXcuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2l0aGRyYXcgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2RlYml0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFpbHlfY3JlZGl0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBhbmQgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbW9udGhseV90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gY3VycmVudCBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbW9udGhseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfY3JlZGl0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYGFjaGAsIHRoZSBuZXh0LWRheSBjdXRvZmYgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIHNhbWUtZGF5IGN1dG9mZiBpcyAzOjMwIFBNIEVhc3Rlcm4gVGltZS4gSWYgdGhlIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhZnRlciB0aGlzIGN1dG9mZiBidXQgYmVmb3JlIHRoZSBuZXh0LWRheSBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzOyB0aGlzIHdpbGwgYXBwbHkgdG8gYm90aCBsZWdzIG9mIHRoZSB0cmFuc2ZlciBpZiBhcHBsaWNhYmxlLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHJ0cGAsICBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgcm91dGUgYmV0d2VlbiBSZWFsIFRpbWUgUGF5bWVudCByYWlsIGJ5IFRDSCBvciBGZWROb3cgcmFpbHMgYXMgbmVjZXNzYXJ5LiBJZiBhIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhcyBgcnRwYCBhbmQgdGhlIGNvdW50ZXJwYXJ0eSBhY2NvdW50IGlzIG5vdCBlbGlnaWJsZSBmb3IgUlRQLCB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgcmVxdWVzdCB3aWxsIGZhaWwgd2l0aCBhbiBgSU5WQUxJRF9GSUVMRGAgZXJyb3IgY29kZS4gVG8gcHJlLWNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGEgY291bnRlcnBhcnR5IGFjY291bnQgY2FuIHN1cHBvcnQgUlRQLCBjYWxsIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgYmVmb3JlIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBSdHAgPSAncnRwJ1xufVxuXG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR3by1sZXR0ZXIgY29kZSBmb3IgdGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwdWJsaWMtZmFjaW5nIHN1cmZhY2VzLCBlLmcuIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIGFuZCBzaG91bGQgYmUgc3RvcmVkIGFzc29jaWF0ZWQgd2l0aCBlbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRiYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggSUQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgdGF4X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBjcmVkaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGViaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTkFJQ1MgY29kZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBuYWljc19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyIChpLmUuIHRoZSBvcmlnaW5hdG9yKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGV0YWlsZWRPcmlnaW5hdG9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3I6IERldGFpbGVkT3JpZ2luYXRvcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxPcmlnaW5hdG9yPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcnM6IEFycmF5PE9yaWdpbmF0b3I+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIGNvbXBsZXRpbmcgcXVlc3Rpb25zIGluIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVSTCB0aGF0IHlvdSB3aWxsIHJlZGlyZWN0IHRoZSBlbmQgY3VzdG9tZXIgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbmJvYXJkaW5nX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWN1cnJpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWN1cnJpbmcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZW5kIHVzZXIgaXMgaW5pdGlhdGluZyB0aGUgc3BlY2lmaWMgdHJhbnNmZXIgdGhlbXNlbHZlcyB2aWEgYW4gaW50ZXJhY3RpdmUgVUksIHRoaXMgc2hvdWxkIGJlIGB0cnVlYDsgZm9yIGF1dG9tYXRpYyByZWN1cnJpbmcgcGF5bWVudHMgd2hlcmUgdGhlIGVuZCB1c2VyIGlzIG5vdCBhY3R1YWxseSBpbml0aWF0aW5nIGVhY2ggaW5kaXZpZHVhbCB0cmFuc2ZlciwgaXQgc2hvdWxkIGJlIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBjcmVhdGVkIGByZWN1cnJpbmdfdHJhbnNmZXJgIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiBOZXcgb3JpZ2luYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIGB0ZXN0X2Nsb2NrYCBhZHZhbmNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJEZXZpY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI/OiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyOiBSZWN1cnJpbmdUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcnM6IEFycmF5PFJlY3VycmluZ1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZSBleGVjdXRlZCBvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF91bml0OiBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVjdXJyaW5nIGBpbnRlcnZhbF91bml0c2AgYmV0d2VlbiBvcmlnaW5hdGlvbnMuIFRoZSByZWN1cnJpbmcgaW50ZXJ2YWwgKGJlZm9yZSBob2xpZGF5IGFkanVzdG1lbnQpIGlzIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgYGludGVydmFsX3VuaXRgIGFuZCBgaW50ZXJ2YWxfY291bnRgLiBGb3IgZXhhbXBsZSwgdG8gc2NoZWR1bGUgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2hpY2ggb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IHR3byB3ZWVrcywgc2V0IGBpbnRlcnZhbF91bml0YCA9IGB3ZWVrYCBhbmQgYGludGVydmFsX2NvdW50YCA9IDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHRyYW5zZmVyLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgd2Vla2AsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNSAoRnJpZGF5KS4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYG1vbnRoYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgdHJhbnNmZXIgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi4gIFRoZSB0cmFuc2ZlciB3aWxsIGJlIG9yaWdpbmF0ZWQgb24gdGhlIG5leHQgYXZhaWxhYmxlIGJhbmtpbmcgZGF5IGlmIHRoZSBkZXNpZ25hdGVkIGRheSBpcyBhIG5vbiBiYW5raW5nIGRheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiAgYGFjdGl2ZWA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3VycmVudGx5IGFjdGl2ZS4gYGNhbmNlbGxlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50IG9yIFBsYWlkLiBgZXhwaXJlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCBhbGwgb3JpZ2luYXRpb25zIGFjY29yZGluZyB0byBpdHMgcmVjdXJyaW5nIHNjaGVkdWxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVmdW5kIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWZ1bmRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHJlZnVuZCB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWZ1bmQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWZ1bmQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVmdW5kIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBldmVudCB0eXBlIGZvciBhIHJlZnVuZCBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgcmVmdW5kIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVmdW5kLiAgYHBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuIGBzZXR0bGVkYDogQ3JlZGl0cyBoYXZlIGJlZW4gcmVmdW5kZWQgdG8gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiBgY2FuY2VsbGVkYDogVGhlIHJlZnVuZCB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIGBmYWlsZWRgOiBUaGUgcmVmdW5kIGhhcyBmYWlsZWQuIGByZXR1cm5lZGA6IFRoZSByZWZ1bmQgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWZ1bmRTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBBIHJlcGF5bWVudCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgb25lIG9yIG1vcmUgZ3VhcmFudGVlZCB0cmFuc2FjdGlvbnMgcmVjZWl2ZSBhIHJldHVybi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsaWdpYmxlIHJldHVybnMgaW4gYSBkYXksIHRoZXkgYXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSByZXBheW1lbnQuICBSZXBheW1lbnRzIGFyZSBzZW50IG92ZXIgQUNILCB3aXRoIGZ1bmRzIHR5cGljYWxseSBhdmFpbGFibGUgb24gdGhlIG5leHQgYmFua2luZyBkYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSByZXBheW1lbnQgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZWNpbWFsIGFtb3VudCBvZiB0aGUgcmVwYXltZW50IGFzIGl0IGFwcGVhcnMgb24geW91ciBhY2NvdW50IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50IHRvIHF1ZXJ5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvcmV0dXJuL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwYXltZW50X3JldHVybnM6IEFycmF5PFRyYW5zZmVyUmVwYXltZW50UmV0dXJuPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB1bml0IG9mIHRoZSByZWN1cnJpbmcgaW50ZXJ2YWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0IHtcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIE1vbnRoID0gJ21vbnRoJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiBgc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBQbGFpZCBsaW5rZWQgYWNjb3VudC4gYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHN3ZWVwIG9mIGZ1bmRzIHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIEEgc3dlZXAgaXMgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3dlZXAgZXZlbnRzIChldmVudHMgb2YgdHlwZSBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHN3ZWVwX2lkYC4gIGBzd2VwdGAgZXZlbnRzIG9jY3VyIHdoZW4gdGhlIHRyYW5zZmVyIGFtb3VudCBpcyBjcmVkaXRlZCBvciBkZWJpdGVkIGZyb20geW91ciBzd2VlcCBhY2NvdW50LCBkZXBlbmRpbmcgb24gdGhlIGB0eXBlYCBvZiB0aGUgdHJhbnNmZXIuIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIGEgdHJhbnNmZXIgaXMgcmV0dXJuZWQgYW5kIFBsYWlkIHVuZG9lcyB0aGUgY3JlZGl0IG9yIGRlYml0LiAgVGhlIHRvdGFsIHN1bSBvZiB0aGUgYHN3ZXB0YCBhbmQgYHJldHVybl9zd2VwdGAgZXZlbnRzIGlzIGVxdWFsIHRvIHRoZSBgYW1vdW50YCBvZiB0aGUgc3dlZXAgUGxhaWQgY3JlYXRlcyBhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IG9mIHRoZSBlbnRyeSBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBkZWNpbWFsIGFtb3VudCBvZiB0aGUgc3dlZXAgYXMgaXQgYXBwZWFycyBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyIChlLmcuIFxcXCItMTAuMDBcXFwiKSAgSWYgYW1vdW50IGlzIG5vdCBwcmVzZW50LCB0aGUgc3dlZXAgd2FzIG5ldC1zZXR0bGVkIHRvIHplcm8gYW5kIG91dHN0YW5kaW5nIGRlYml0cyBhbmQgY3JlZGl0cyBiZXR3ZWVuIHRoZSBzd2VlcCBhY2NvdW50IGFuZCBQbGFpZCBhcmUgYmFsYW5jZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3dlZXAgc2V0dGxlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzZXR0bGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJpZ2dlcj86IFN3ZWVwVHJpZ2dlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3dlZXAgKFVVSUQpIG9yIGEgc2hvcnRlbmVkIGZvcm0gY29uc2lzdGluZyBvZiB0aGUgZmlyc3QgOCBjaGFyYWN0ZXJzIG9mIHRoZSBpZGVudGlmaWVyICg4LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2VlcHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHN3ZWVwcyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIGluY2x1ZGVkIGB0cmFuc2Zlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8VHJhbnNmZXJTd2VlcD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHN3ZWVwIGZvciB0aGUgdHJhbnNmZXIuICBgdW5zd2VwdGA6IFRoZSB0cmFuc2ZlciBoYXNuXFwndCBiZWVuIHN3ZXB0IHlldC4gYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byB0aGUgc3dlZXAgYWNjb3VudC4gYHN3ZXB0X3NldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgY3VzdG9tZXLigJlzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQuIGByZXR1cm5fc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBiYWNrIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiBgbnVsbGA6IFRoZSB0cmFuc2ZlciB3aWxsIG5ldmVyIGJlIHN3ZXB0IChlLmcuIGlmIHRoZSB0cmFuc2ZlciBpcyBjYW5jZWxsZWQgb3IgcmV0dXJuZWQgYmVmb3JlIGJlaW5nIHN3ZXB0KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTd2VlcFN0YXR1cyB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBVbnN3ZXB0ID0gJ3Vuc3dlcHQnLFxuICAgIFN3ZXB0ID0gJ3N3ZXB0JyxcbiAgICBTd2VwdFNldHRsZWQgPSAnc3dlcHRfc2V0dGxlZCcsXG4gICAgUmV0dXJuU3dlcHQgPSAncmV0dXJuX3N3ZXB0J1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclRlc3RDbG9jayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgZWRpdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGAgd2ViaG9vayBpcyBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoZSB1c2VyIGNhbiByZXN0b3JlIGFjY2VzcyB0byB0aGUgcmV2b2tlZCBhY2NvdW50IGJ5IHJlZ3JhbnRpbmcgcGVybWlzc2lvbnMgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBpbiBiZXRhLiBJdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBHQSBpbiBKYW4gMjAyNC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBmb3IgdGhlIHVzZXIuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBub3QgcHJvdmlkZWQsIGFkZHJlc3Mgd2l0aCBvbmx5IGNvdW50cnkgY29kZSBvciBmdWxsIGFkZHJlc3MuICBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDdXN0b21QYXNzd29yZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlcklETnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYCB3ZWJob29rIG1heSBiZSBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyB1c2VkIGVpdGhlciB0aGUgW215LnBsYWlkLmNvbSBwb3J0YWxdKGh0dHBzOi8vbXkucGxhaWQuY29tKSBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9u4oCZcyBPQXV0aCBjb25zZW50IHBvcnRhbCB0byByZXZva2UgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gVGhpcyB3ZWJob29rIGlzIG5vdCBndWFyYW50ZWVkIHRvIGFsd2F5cyBiZSBmaXJlZCB1cG9uIGNvbnNlbnQgcmV2b2NhdGlvbiwgc2luY2Ugc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gT25jZSBhY2Nlc3MgdG8gYW4gSXRlbSBoYXMgYmVlbiByZXZva2VkLCBpdCBjYW5ub3QgYmUgcmVzdG9yZWQuIElmIHRoZSB1c2VyIHN1YnNlcXVlbnRseSByZXR1cm5zIHRvIHlvdXIgYXBwbGljYXRpb24sIGEgbmV3IEl0ZW0gbXVzdCBiZSBjcmVhdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5IHtcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IGZyZXF1ZW5jeSBvZiBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IHR5cGUgLSBgR1JPU1NgLCBgTkVUYCwgb3IgYFVOS05PV05gIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBHcm9zcyA9ICdHUk9TUycsXG4gICAgTmV0ID0gJ05FVCdcbn1cblxuLyoqXG4gKiBVc2VyVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eT86IENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWYWxpZGF0aW9uU291cmNlXG4gICAgICovXG4gICAgVmFsaWRhdGlvblNvdXJjZVJlZmVyZW5jZUlkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxWYWxpZGF0aW9uU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZXNcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRTogQXJyYXk8VmFsaWRhdGlvblNvdXJjZT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSB3YXMgbm90IHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMgYWZ0ZXIgc2V2ZW4gZGF5cyBzaW5jZSB0aGUgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXQgd2FzIG1hZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9FWFBJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogUmVwb3J0aW5nSW5mb3JtYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnR9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVF9SRVNQT05TRTogVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBBc3NldHM7XG59XG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVEFUVVNfVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uUmVmcmVzaFN0YXR1cyB7XG4gICAgU3RhdHVzVXNlclByZXNlbmNlUmVxdWlyZWQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRUQnLFxuICAgIFN1Y2Nlc3NmdWwgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1VDQ0VTU0ZVTCcsXG4gICAgTm90Rm91bmQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfTk9UX0ZPVU5EJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJRURcXFwiYDogVGhlIGluZm9ybWF0aW9uIHdhcyBzdWNjZXNzZnVsbHkgdmVyaWZpZWQuICBgXFxcIlVOVkVSSUZJRURcXFwiYDogVGhlIHZlcmlmaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIHBlcmZvcm1lZC4gIGBcXFwiTkVFRFNfSU5GT1xcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHdhcyBhdHRlbXB0ZWQgYnV0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIG1pc3NpbmcgaW5mb3JtYXRpb24uICBcXFwiYFVOQUJMRV9UT19WRVJJRllgXFxcIjogVGhlIHZlcmlmaWNhdGlvbiB3YXMgcGVyZm9ybWVkIGFuZCB0aGUgaW5mb3JtYXRpb24gY291bGQgbm90IGJlIHZlcmlmaWVkLiAgYFxcXCJVTktOT1dOXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIFZlcmlmaWVkID0gJ1ZFUklGSUVEJyxcbiAgICBVbnZlcmlmaWVkID0gJ1VOVkVSSUZJRUQnLFxuICAgIE5lZWRzSW5mbyA9ICdORUVEU19JTkZPJyxcbiAgICBVbmFibGVUb1ZlcmlmeSA9ICdVTkFCTEVfVE9fVkVSSUZZJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogVzIgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBpbmNvbWUgZGF0YSB0YWtlbiBmcm9tIGEgVzIgdGF4IGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggeWVhciBvZiB0aGUgVzIgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZWUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV93YWdlcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSBtZWRpY2FyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvY2F0ZWQgdGlwcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGJveF85Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOb25xdWFsaWZpZWQgcGxhbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfMTI/OiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJldGlyZW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHJldGlyZW1lbnRfcGxhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcmQgcGFydHkgc2ljayBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBvdGhlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz47XG59XG4vKipcbiAqIERhdGEgb24gdGhlIFcyIEJveCAxMlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMkJveDEyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXMkJveDEyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVzIgQm94IDEyIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGNvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdhZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGVtcGxveWVyX3N0YXRlX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGVfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbF9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG59XG4vKipcbiAqIFdhbGxldENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgZS13YWxsZXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IFdhbGxldEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZSwgdXNlZCB3aXRoIGUtd2FsbGV0cyBhbmQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0SVNPQ3VycmVuY3lDb2RlIHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJ1xufVxuXG4vKipcbiAqIFdhbGxldExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgZS13YWxsZXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGF0IGUtd2FsbGV0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGUtd2FsbGV0cyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlLXdhbGxldHMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBXYWxsZXRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGUtd2FsbGV0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRzOiBBcnJheTxXYWxsZXQ+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBlLXdhbGxldHMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCBlLXdhbGxldCBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldE51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxJQkFOfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IHNjaGVtZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQQVlPVVRgIGFuZCBgUkVGVU5EYC4gIGBGQVNURVJfUEFZTUVOVFNgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCBzY2hlbWUgd2l0aGluIHRoZSBVSy4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0UGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBGYXN0ZXJQYXltZW50cyA9ICdGQVNURVJfUEFZTUVOVFMnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHdhbGxldC4gIGBVTktOT1dOYDogVGhlIHdhbGxldCBzdGF0dXMgaXMgdW5rbm93bi4gIGBBQ1RJVkVgOiBUaGUgd2FsbGV0IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gc2VuZCBtb25leSB0byBhbmQgcmVjZWl2ZSBtb25leSBmcm9tLiAgYENMT1NFRGA6IFRoZSB3YWxsZXQgaXMgY2xvc2VkLiBBbnkgdHJhbnNhY3Rpb25zIG1hZGUgdG8gb3IgZnJvbSB0aGlzIHdhbGxldCB3aWxsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0U3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIENsb3NlZCA9ICdDTE9TRUQnXG59XG5cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9uIGRldGFpbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQW1vdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciBmb3IgYSBXYWxsZXQgVHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJhbmsgYWNjb3VudCBudW1iZXJzLiBFeGFjdGx5IG9uZSBvZiBJQkFOIG9yIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWx9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwgfCBudWxsO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLiBFbnN1cmUgdGhhdCB0aGUgYHJlZmVyZW5jZWAgZmllbGQgaXMgdW5pcXVlIGZvciBlYWNoIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZXJyb3IgY29kZSBvZiBhIGZhaWxlZCB0cmFuc2FjdGlvbi4gRXJyb3IgY29kZXMgaW5jbHVkZTogYEVYVEVSTkFMX1NZU1RFTWA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgZGVjbGluZWQgYnkgYW4gZXh0ZXJuYWwgc3lzdGVtLiBgRVhQSVJFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLiBgQ0FOQ0VMTEVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2FzIHJlc2NpbmRlZC4gYElOVkFMSURgOiBUaGUgdHJhbnNhY3Rpb24gZGlkIG5vdCBtZWV0IGNlcnRhaW4gY3JpdGVyaWEsIHN1Y2ggYXMgYW4gaW5hY3RpdmUgYWNjb3VudCBvciBubyB2YWxpZCBjb3VudGVycGFydHksIGV0Yy4gYFVOS05PV05gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIHVuc3VjY2Vzc2Z1bCwgYnV0IHRoZSBleGFjdCBjYXVzZSBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHtcbiAgICBFeHRlcm5hbFN5c3RlbSA9ICdFWFRFUk5BTF9TWVNURU0nLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCcsXG4gICAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG4gICAgSW52YWxpZCA9ICdJTlZBTElEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgd2FsbGV0IHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgdHJhbnNhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdHJhbnNhY3Rpb25zIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gQXNzZXQgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB3YXJuaW5nIGRhdGEgaW4gdGhlIHJlc3BvbnNlLCBpbmRpY2F0aW5nIHdoeSBvYnRhaW5pbmcgdGhlIG93bmVyIGluZm9ybWF0aW9uIGZhaWxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBBU1NFVF9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgT1dORVJTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuYElOVkVTVE1FTlRTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBJbnZlc3RtZW50cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogV2FybmluZ1dhcm5pbmdDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ2F1c2U7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBraW5kIG9mIG9mZmljaWFsIGRvY3VtZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LiAgYGJpcnRoX2NlcnRpZmljYXRlYCAtIEEgY2VydGlmaWNhdGUgb2YgYmlydGggIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBsaWNlbnNlIHRvIG9wZXJhdGUgYSBtb3RvciB2ZWhpY2xlICBgaW1taWdyYXRpb25fbnVtYmVyYCAtIEltbWlncmF0aW9uIG9yIHJlc2lkZW5jZSBkb2N1bWVudHMgIGBtaWxpdGFyeV9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYSBtaWxpdGFyeSBncm91cCAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcGFzc3BvcnRgIC0gQW4gb2ZmaWNpYWwgcGFzc3BvcnQgaXNzdWUgYnkgYSBnb3Zlcm5tZW50ICBgcGVyc29uYWxfaWRlbnRpZmljYXRpb25gIC0gQW55IGdlbmVyaWMgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gdGhhdCBpcyBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcmF0aW9uX2NhcmRgIC0gSWRlbnRpZmljYXRpb24gdGhhdCBlbnRpdGxlcyB0aGUgaG9sZGVyIHRvIHJhdGlvbnMgIGBzc25gIC0gVW5pdGVkIFN0YXRlcyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyICBgc3R1ZGVudF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzICBgdHJhdmVsX2RvY3VtZW50YCAtIFZpc2FzLCBlbnRyeSBwZXJtaXRzLCByZWZ1Z2VlIGRvY3VtZW50cywgZXRjLiAgYHZvdGVyX2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygdm90aW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGUge1xuICAgIEJpcnRoQ2VydGlmaWNhdGUgPSAnYmlydGhfY2VydGlmaWNhdGUnLFxuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSW1taWdyYXRpb25OdW1iZXIgPSAnaW1taWdyYXRpb25fbnVtYmVyJyxcbiAgICBNaWxpdGFyeUlkID0gJ21pbGl0YXJ5X2lkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFBlcnNvbmFsSWRlbnRpZmljYXRpb24gPSAncGVyc29uYWxfaWRlbnRpZmljYXRpb24nLFxuICAgIFJhdGlvbkNhcmQgPSAncmF0aW9uX2NhcmQnLFxuICAgIFNzbiA9ICdzc24nLFxuICAgIFN0dWRlbnRJZCA9ICdzdHVkZW50X2lkJyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnLFxuICAgIFRyYXZlbERvY3VtZW50ID0gJ3RyYXZlbF9kb2N1bWVudCcsXG4gICAgVm90ZXJJZCA9ICd2b3Rlcl9pZCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBlbnRpdHkgc2NyZWVuaW5nIHJldmlld1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBlbnRpdGllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxFbnRpdHlXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBlbnRpdHkgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIE9yZ2FuaXphdGlvbnNcXFwiIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RQcm9ncmFtPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbXM6IEFycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zPzogVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IG9yIFBFUCBsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pdmVyc2FsIGlkZW50aWZpZXIgZm9yIGEgd2F0Y2hsaXN0IGluZGl2aWR1YWwgdGhhdCBpcyBzdGFibGUgYWNyb3NzIHNlYXJjaGVzIGFuZCB1cGRhdGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHBsYWlkX3VpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2Ugc2FuY3Rpb24gb3Igd2F0Y2hsaXN0LiBXaGVuIG9uZSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc291cmNlX3VpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogU2NyZWVuaW5nSGl0QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdERhdGF9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGRhdGE/OiBTY3JlZW5pbmdIaXREYXRhO1xufVxuLyoqXG4gKiBMb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbG9jYXRpb24gc3RyaW5nLCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgZWxlbWVudHMgbGlrZSBzdHJlZXQsIGNpdHksIHBvc3RhbCBjb2RlcyBhbmQgY291bnRyeSBjb2Rlcy4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgY29tcGxldGUgb3Igd2VsbC1mb3JtYXR0ZWQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHJldmlldy4gQWxsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0cyBiZWdpbiBpbiBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUgYnV0IGNhbiBiZSBjaGFuZ2VkIGJ5IGNyZWF0aW5nIGEgcmV2aWV3LiBXaGVuIGEgaGl0IGlzIGluIHRoZSBgcGVuZGluZ19yZXZpZXdgIHN0YXRlLCBpdCB3aWxsIGFsd2F5cyBzaG93IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgd2F0Y2hsaXN0IGRhdGEgUGxhaWQgaGFzIGF2YWlsYWJsZSBhbmQgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgbGF0ZXN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIHNhdmVkIGluIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBPbmNlIGEgaGl0IGhhcyBiZWVuIG1hcmtlZCBhcyBgY29uZmlybWVkYCBvciBgZGlzbWlzc2VkYCBpdCB3aWxsIG5vIGxvbmdlciBiZSB1cGRhdGVkIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGFzIGl0IHdhcyB3aGVuIHRoZSByZXZpZXcgd2FzIGZpcnN0IGNvbmR1Y3RlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cyB7XG4gICAgQ29uZmlybWVkID0gJ2NvbmZpcm1lZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgRGlzbWlzc2VkID0gJ2Rpc21pc3NlZCdcbn1cblxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGNoYW5nZXMgdG8gd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHByb2dyYW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXMgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHJldmlld3MgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHNjcmVlbmluZyBpcyBzdGlsbCBwZW5kaW5nIHJldmlldywgaGFzIGJlZW4gcmVqZWN0ZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogTmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQgYXMgbG93IHF1YWxpdHkgZWl0aGVyIGJ5IHRoZWlyIGBzb3VyY2VgIGxpc3QsIG9yIGJ5IGBwbGFpZGAgYnkgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBjaGVja3MgZG9uZSBieSBQbGFpZC4gUGxhaWQgZG9lcyBub3QgZXZlciBzdXJmYWNlIGEgaGl0IGFzIGEgcmVzdWx0IG9mIGEgd2VhayBuYW1lIGFsb25lLiBJZiBhIG5hbWUgaGFzIG5vIHF1YWxpdHkgaXNzdWVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vbmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbiB7XG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBTb3VyY2UgPSAnc291cmNlJyxcbiAgICBQbGFpZCA9ICdwbGFpZCdcbn1cblxuLyoqXG4gKiBUaGUgUGxhaWQgZW52aXJvbm1lbnQgdGhlIHdlYmhvb2sgd2FzIHNlbnQgZnJvbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va0Vudmlyb25tZW50VmFsdWVzIHtcbiAgICBEZXZlbG9wbWVudCA9ICdkZXZlbG9wbWVudCcsXG4gICAgU2FuZGJveCA9ICdzYW5kYm94JyxcbiAgICBQcm9kdWN0aW9uID0gJ3Byb2R1Y3Rpb24nXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgdHlwZXMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgdGhpcyB0ZXN0IGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va1R5cGUge1xuICAgIEF1dGggPSAnQVVUSCcsXG4gICAgSG9sZGluZ3MgPSAnSE9MRElOR1MnLFxuICAgIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zID0gJ0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUycsXG4gICAgSXRlbSA9ICdJVEVNJyxcbiAgICBMaWFiaWxpdGllcyA9ICdMSUFCSUxJVElFUycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ1RSQU5TQUNUSU9OUycsXG4gICAgQXNzZXRzID0gJ0FTU0VUUydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHdlYmhvb2sgaXMgdXBkYXRlZC4gVGhpcyB3aWxsIGJlIHNlbnQgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgbmV3X3dlYmhvb2tfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIHByZS10YXggZWFybmluZ3MsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQ6IGFzeW5jIChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzR2V0JywgJ2FjY291bnRzR2V0UmVxdWVzdCcsIGFjY291bnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0OiBhc3luYyAoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhcHBsaWNhdGlvbkdldCcsICdhcHBsaWNhdGlvbkdldFJlcXVlc3QnLCBhcHBsaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FwcGxpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRDcmVhdGUnLCAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcjogYXN5bmMgKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRGaWx0ZXInLCAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JywgYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZmlsdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0R2V0JywgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldDogYXN5bmMgKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRQZGZHZXQnLCAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaDogYXN5bmMgKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZWZyZXNoJywgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnLCBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQ6IGFzeW5jIChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2F1dGhHZXQnLCAnYXV0aEdldFJlcXVlc3QnLCBhdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQmFsYW5jZUdldCcsICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWw6IGFzeW5jIChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNhbmNlbCcsICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDcmVhdGUnLCAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRMaXN0JywgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYXNlUmVwb3J0R2V0OiBhc3luYyAoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYXNlUmVwb3J0R2V0JywgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JywgYmFzZVJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0OiBhc3luYyAoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25EdXBsaWNhdGVHZXQnLCAnYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCcsIGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9kdXBsaWNhdGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGU6IGFzeW5jIChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydENyZWF0ZScsICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JywgYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldDogYXN5bmMgKGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0R2V0JywgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0OiBhc3luYyAoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRMaXN0JywgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQnLCAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGU6IGFzeW5jIChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJDcmVhdGUnLCAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXc6IGFzeW5jIChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJSZXZpZXcnLCAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnLCBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvcmV2aWV3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZTogYXN5bmMgKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlclVwZGF0ZScsICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcsIGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0OiBhc3luYyAoYm9keTogb2JqZWN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NhdGVnb3JpZXNHZXQnLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NhdGVnb3JpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUJhbmtJbmNvbWVHZXQnLCAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnLCBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lUGRmR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVJlZnJlc2gnLCAnY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGU6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlJywgJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0OiBhc3luYyAoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQnLCAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEVtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEVtcGxveW1lbnRHZXQnLCAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnLCBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQ6IGFzeW5jIChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0JywgJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCcsIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZUdldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChyZXF1ZXN0Qm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjazogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2gnLCAnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnQgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZTogYXN5bmMgKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlDcmVhdGUnLCAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JywgY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQ6IGFzeW5jIChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5R2V0JywgJ2NyZWRpdFJlbGF5R2V0UmVxdWVzdCcsIGNyZWRpdFJlbGF5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0OiBhc3luYyAoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVBkZkdldCcsICdjcmVkaXRSZWxheVBERkdldFJlcXVlc3QnLCBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZTogYXN5bmMgKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZW1vdmUnLCAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JywgY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0U2Vzc2lvbnNHZXQ6IGFzeW5jIChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFNlc3Npb25zR2V0JywgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcsIGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3Nlc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJHZXQ6IGFzeW5jIChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJHZXQnLCAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckxpc3Q6IGFzeW5jIChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJMaXN0JywgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcsIGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldDogYXN5bmMgKGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaEdldCcsICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQ6IGFzeW5jIChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5R2V0JywgJ2lkZW50aXR5R2V0UmVxdWVzdCcsIGlkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQ6IGFzeW5jIChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaWFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpYWJpbGl0aWVzR2V0JywgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcsIGxpYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZTogYXN5bmMgKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua0RlbGl2ZXJ5Q3JlYXRlJywgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnLCBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQ6IGFzeW5jIChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUdldCcsICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlOiBhc3luYyAobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UnLCAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcsIGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQ6IGFzeW5jIChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkdldCcsICdsaW5rVG9rZW5HZXRSZXF1ZXN0JywgbGlua1Rva2VuR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyQ3JlYXRlJywgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyUmVtb3ZlJywgJ3BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldCcsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UnLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvcmV2ZXJzZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3Q6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlOiBhc3luYyAocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUNyZWF0ZScsICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldDogYXN5bmMgKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVHZXQnLCAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmU6IGFzeW5jIChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlUmVtb3ZlJywgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQ6IGFzeW5jIChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFjY291bnRHZXQnLCAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXV0aEdldCcsICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldDogYXN5bmMgKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFsYW5jZUdldCcsICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcsIHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlJywgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldDogYXN5bmMgKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySWRlbnRpdHlHZXQnLCAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JywgcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0OiBhc3luYyAocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JMaWFiaWxpdGllc0dldCcsICdwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYzogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYycsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbUZpcmVXZWJob29rJywgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtUmVzZXRMb2dpbicsICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzOiBhc3luYyAoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cycsICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnLCBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50czogYXN5bmMgKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMnLCAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0Jywgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4nLCAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnLCBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxEZWNpc2lvblJlcG9ydCcsICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlOiBhc3luYyAoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxFdmFsdWF0ZScsICdzaWduYWxFdmFsdWF0ZVJlcXVlc3QnLCBzaWduYWxFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkOiBhc3luYyAoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzRG93bmxvYWQnLCAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcsIHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Q6IGFzeW5jIChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNMaXN0JywgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcsIHN0YXRlbWVudHNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2g6IGFzeW5jIChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNSZWZyZXNoJywgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcsIHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbmhhbmNlOiBhc3luYyAodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbmhhbmNlJywgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2g6IGFzeW5jICh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VucmljaCcsICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2VucmljaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVmcmVzaCcsICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlJywgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzTGlzdDogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNMaXN0JywgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlJywgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jICh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1N5bmMnLCAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0JywgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jICh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQmFsYW5jZUdldCcsICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWw6IGFzeW5jICh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FuY2VsJywgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0OiBhc3luYyAodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhcGFiaWxpdGllc0dldCcsICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnLCB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0OiBhc3luYyAodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQnLCAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDcmVhdGUnLCAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkOiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkJywgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0OiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCcsICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRMaXN0JywgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50U3luYycsICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQ6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVySW50ZW50R2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdCcsICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlOiBhc3luYyAodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUnLCAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyR2V0JywgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3OiBhc3luYyAodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlcldpdGhkcmF3JywgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3Q6IGFzeW5jICh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGlzdCcsICd0cmFuc2Zlckxpc3RSZXF1ZXN0JywgdHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1ldHJpY3NHZXQ6IGFzeW5jICh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWV0cmljc0dldCcsICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JywgdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZScsICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZScsICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0dldCcsICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3Q6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdCcsICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENhbmNlbCcsICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlJywgJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQ6IGFzeW5jICh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kR2V0JywgJ3RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRMaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0OiBhc3luYyAodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QnLCAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwR2V0JywgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwTGlzdCcsICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZTogYXN5bmMgKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckNyZWF0ZScsICd1c2VyQ3JlYXRlUmVxdWVzdCcsIHVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGU6IGFzeW5jICh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJVcGRhdGUnLCAndXNlclVwZGF0ZVJlcXVlc3QnLCB1c2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlOiBhc3luYyAod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRDcmVhdGUnLCAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcsIHdhbGxldENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldEdldDogYXN5bmMgKHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0R2V0JywgJ3dhbGxldEdldFJlcXVlc3QnLCB3YWxsZXRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0OiBhc3luYyAod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRMaXN0JywgJ3dhbGxldExpc3RSZXF1ZXN0Jywgd2FsbGV0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGU6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZScsICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25HZXQnLCAnd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25MaXN0JywgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnLCB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXN0b3J5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2hpdC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQ6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldDogYXN5bmMgKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCcsICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcsIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB0aGUgY3VzdG9tZXIgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydC4gQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Jhc2VSZXBvcnRHZXRSZXF1ZXN0fSBiYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhc2VSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbS4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYGZyYXVkX3Jpc2tgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSByZXBvcnQgb2YgYSByZWxheSB0b2tlbiAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRhc2hib2FyZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnRzLCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gXFxcIk5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gSWYgdGhlIGFjY291bnQgbXVzdCBiZSBsaW5rZWQgdG8gYSBuZXcgb3IgZGlmZmVyZW50IHBhcnRuZXIgcmVzb3VyY2UsIGNyZWF0ZSBhIG5ldyBJdGVtIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cgYWdhaW47IGEgbmV3IHByb2Nlc3NvciB0b2tlbiBjYW4gdGhlbiBiZSBjcmVhdGVkIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gUHJvY2Vzc29yIHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFRyYW5zYWN0aW9ucyB1cGRhdGUgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQWNjb3VudCBTZWxlY3QgdjIuICBgQVVUSF9EQVRBX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBdXRoIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gRm9yIG9wdGltYWwgcmVzdWx0cywgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIGN1c3RvbWVycyB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBpdGVtcyB3aXRoIFRyYW5zYWN0aW9ucyAodXNpbmcgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBvcHRpb24pLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgaW5jb21lIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgaW5jb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBUaGUgYHVzZXJfdG9rZW5gIHNob3VsZCBiZSBpbiB0aGUgcmVzcG9uc2Ugb2YgYC91c2VyL2NyZWF0ZWAgY2FsbCAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IHdpdGggYSBub24tZXhpc3QgYHVzZXJfdG9rZW5gLCB0aGUgY2FsbCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciB0b2tlbiBpcyBub3QgZm91bmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYXNlUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYGZyYXVkX3Jpc2tgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudCAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZGFzaGJvYXJkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95ZXJzU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgaWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGF1dG9maWxsIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudHMsIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBcXFwiTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBJZiB0aGUgYWNjb3VudCBtdXN0IGJlIGxpbmtlZCB0byBhIG5ldyBvciBkaWZmZXJlbnQgcGFydG5lciByZXNvdXJjZSwgY3JlYXRlIGEgbmV3IEl0ZW0gYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggdGhlIExpbmsgZmxvdyBhZ2FpbjsgYSBuZXcgcHJvY2Vzc29yIHRva2VuIGNhbiB0aGVuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiBQcm9jZXNzb3IgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbm5vdCBiZSB1c2VkIHdpdGggT0F1dGggaW5zdGl0dXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIExpbmsgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcywgZGV2ZWxvcGluZyBhIFNpZ25hbCBzY29yZS4gIElmIHlvdSBhcmUgdXNpbmcgb3RoZXIgUGxhaWQgcHJvZHVjdHMgYWZ0ZXIgTGluaywgZS5nLiBJZGVudGl0eSBvciBBc3NldHMsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgYWZ0ZXIgdGhvc2UgcHJvZHVjdCBjYWxscyBhcmUgY29tcGxldGUuICBFeGFtcGxlIGZsb3c6IExpbmsgaXMgaW5pdGlhbGl6ZWQgd2l0aCBBdXRoLCBjYWxsIGAvYXV0aC9nZXRgIGZvciB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIsIGNhbGwgYC9pZGVudGl0eS9nZXRgIHRvIHJldHJpZXZlIGJhbmsgb3duZXJzaGlwIGRldGFpbHMsIHRoZW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBiZWdpbiBTaWduYWwgZGF0YSBjb2xsZWN0aW9uLiBMYXRlciwgb25jZSB5b3UgaGF2ZSBvYnRhaW5lZCBkZXRhaWxzIGFib3V0IHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSB1c2VyLCBjYWxsIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgYSBTaWduYWwgc2NvcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgW1JlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgd2l0aCBzcGVjaWZpYyBwcm9kdWN0IGNvbWJpbmF0aW9uc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlY29tbWVuZGF0aW9ucy1mb3ItaW5pdGlhbGl6aW5nLWxpbmstd2l0aC1zcGVjaWZpYy1wcm9kdWN0LWNvbWJpbmF0aW9ucykuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBQcm9jZXNzaW5nIG9mIHRoZSByZWZ1bmQgd2lsbCBub3Qgb2NjdXIgdW50aWwgYXQgbGVhc3QgNCBidXNpbmVzcyBkYXlzIGZvbGxvd2luZyB0aGUgdHJhbnNmZXJcXCdzIHNldHRsZW1lbnQgZGF0ZSwgcGx1cyBhbnkgaG9sZC9zZXR0bGVtZW50IGRlbGF5cy4gVGhpcyAzLWRheSB3aW5kb3cgaGVscHMgYmV0dGVyIHByb3RlY3QgeW91ciBidXNpbmVzcyBmcm9tIHJlZ3VsYXIgQUNIIHJldHVybnMuIENvbnN1bWVyIGluaXRpYXRlZCByZXR1cm5zICh1bmF1dGhvcml6ZWQgcmV0dXJucykgY291bGQgc3RpbGwgaGFwcGVuIGZvciBhYm91dCA2MCBkYXlzIGZyb20gdGhlIHNldHRsZW1lbnQgZGF0ZS4gSWYgdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGlzIGNhbmNlbGVkLCByZXR1cm5lZCBvciBmYWlsZWQsIGFsbCBwZW5kaW5nIHJlZnVuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNhbmNlbGVkLiBQcm9jZXNzZWQgcmVmdW5kcyBjYW5ub3QgYmUgcmV2b2tlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIHNldCBvZiByZXR1cm5zIHRoYXQgd2VyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuIFRoZSBzdW0gb2YgYW1vdW50cyBvZiByZXR1cm5zIHJldHJpZXZlZCBieSB0aGlzIHJlcXVlc3QgZXF1YWxzIHRoZSBhbW91bnQgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBpbmNvbWUgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBpbmNvbWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBUaGUgYHVzZXJfdG9rZW5gIHNob3VsZCBiZSBpbiB0aGUgcmVzcG9uc2Ugb2YgYC91c2VyL2NyZWF0ZWAgY2FsbCAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IHdpdGggYSBub24tZXhpc3QgYHVzZXJfdG9rZW5gLCB0aGUgY2FsbCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciB0b2tlbiBpcyBub3QgZm91bmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGEgc3BlY2lmaWMgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGN1c3RvbWVyIGluZm9ybWF0aW9uLCBjb3JyZWN0IG91dGRhdGVkIGluZm9ybWF0aW9uLCBhZGQgYSByZWZlcmVuY2UgaWQsIGFzc2lnbiB0aGUgaW5kaXZpZHVhbCB0byBhIHJldmlld2VyLCBhbmQgdXBkYXRlIHdoaWNoIHByb2dyYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbm90IHVwZGF0ZSBgc2VhcmNoX3Rlcm1zYCBhbmQgYHN0YXR1c2AgYXQgdGhlIHNhbWUgdGltZSBzaW5jZSBlZGl0aW5nIGBzZWFyY2hfdGVybXNgIG1heSB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBgc3RhdHVzYCBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBQbGFpZEFwaVxuICogQGV4dGVuZHMge0Jhc2VBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBQbGFpZEFwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB0aGUgY3VzdG9tZXIgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydC4gQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0uICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgZnJhdWRfcmlza2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9mIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBCYW5rIGFjY291bnQgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gSWYgdGhlIGFjY291bnQgbXVzdCBiZSBsaW5rZWQgdG8gYSBuZXcgb3IgZGlmZmVyZW50IHBhcnRuZXIgcmVzb3VyY2UsIGNyZWF0ZSBhIG5ldyBJdGVtIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cgYWdhaW47IGEgbmV3IHByb2Nlc3NvciB0b2tlbiBjYW4gdGhlbiBiZSBjcmVhdGVkIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gUHJvY2Vzc29yIHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXIuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBQcm9jZXNzaW5nIG9mIHRoZSByZWZ1bmQgd2lsbCBub3Qgb2NjdXIgdW50aWwgYXQgbGVhc3QgNCBidXNpbmVzcyBkYXlzIGZvbGxvd2luZyB0aGUgdHJhbnNmZXJcXCdzIHNldHRsZW1lbnQgZGF0ZSwgcGx1cyBhbnkgaG9sZC9zZXR0bGVtZW50IGRlbGF5cy4gVGhpcyAzLWRheSB3aW5kb3cgaGVscHMgYmV0dGVyIHByb3RlY3QgeW91ciBidXNpbmVzcyBmcm9tIHJlZ3VsYXIgQUNIIHJldHVybnMuIENvbnN1bWVyIGluaXRpYXRlZCByZXR1cm5zICh1bmF1dGhvcml6ZWQgcmV0dXJucykgY291bGQgc3RpbGwgaGFwcGVuIGZvciBhYm91dCA2MCBkYXlzIGZyb20gdGhlIHNldHRsZW1lbnQgZGF0ZS4gSWYgdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGlzIGNhbmNlbGVkLCByZXR1cm5lZCBvciBmYWlsZWQsIGFsbCBwZW5kaW5nIHJlZnVuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNhbmNlbGVkLiBQcm9jZXNzZWQgcmVmdW5kcyBjYW5ub3QgYmUgcmV2b2tlZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIFRoZSBgdXNlcl90b2tlbmAgc2hvdWxkIGJlIGluIHRoZSByZXNwb25zZSBvZiBgL3VzZXIvY3JlYXRlYCBjYWxsICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgd2l0aCBhIG5vbi1leGlzdCBgdXNlcl90b2tlbmAsIHRoZSBjYWxsIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIHRva2VuIGlzIG5vdCBmb3VuZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdDogV2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxufVxuXG5cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDZixDQUFDLEVBTFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFLbkI7QUFrQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQTZIRDs7O01BR007QUFDTixJQUFZLG1DQVFYO0FBUkQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7SUFDMUMsMkVBQW9DLENBQUE7QUFDeEMsQ0FBQyxFQVJXLG1DQUFtQyxHQUFuQywyQ0FBbUMsS0FBbkMsMkNBQW1DLFFBUTlDO0FBc0pEOzs7TUFHTTtBQUNOLElBQVksaUNBUVg7QUFSRCxXQUFZLGlDQUFpQztJQUN6QyxxRkFBZ0QsQ0FBQTtJQUNoRCxvR0FBK0QsQ0FBQTtJQUMvRCw4RkFBeUQsQ0FBQTtJQUN6RCwyRUFBc0MsQ0FBQTtJQUN0Qyxp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QUFDLGFBQWEsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLHlDQUF5QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkwsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSx5QkFBeUIsQ0FBQyxnQ0FBa0UsRUFBRSxPQUFhO1FBQzlHLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMseUJBQXlCLENBQUMsZ0NBQWdDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNySyxDQUFDO0NBQ0o7QUFwOEZELDRCQW84RkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEVU1NWV9CQVNFX1VSTCwgYXNzZXJ0UGFyYW1FeGlzdHMsIHNldEFwaUtleVRvT2JqZWN0LCBzZXRCYXNpY0F1dGhUb09iamVjdCwgc2V0QmVhcmVyQXV0aFRvT2JqZWN0LCBzZXRPQXV0aFRvT2JqZWN0LCBzZXRTZWFyY2hQYXJhbXMsIHNlcmlhbGl6ZURhdGFJZk5lZWRlZCwgdG9QYXRoU3RyaW5nLCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gfSBmcm9tICcuL2NvbW1vbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUywgUmVxdWVzdEFyZ3MsIEJhc2VBUEksIFJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHRyYW5zZmVyLiBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZS5nLiBiaWxsIHBheW1lbnQgIGBcXFwidGVsXFxcImAgLSBUZWxlcGhvbmUtSW5pdGlhdGVkIEVudHJ5ICBgXFxcIndlYlxcXCJgIC0gSW50ZXJuZXQtSW5pdGlhdGVkIEVudHJ5IC0gZGViaXRzIGZyb20gYSBjb25zdW1lcuKAmXMgYWNjb3VudCB3aGVyZSB0aGVpciBhdXRob3JpemF0aW9uIGlzIG9idGFpbmVkIG92ZXIgdGhlIEludGVybmV0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBQ0hDbGFzcyB7XG4gICAgQ2NkID0gJ2NjZCcsXG4gICAgUHBkID0gJ3BwZCcsXG4gICAgVGVsID0gJ3RlbCcsXG4gICAgV2ViID0gJ3dlYidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgQVBSIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBUFJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBUFIge1xuICAgIC8qKlxuICAgICAqIEFubnVhbCBQZXJjZW50YWdlIFJhdGUgYXBwbGllZC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBiYWxhbmNlIHRvIHdoaWNoIHRoZSBBUFIgYXBwbGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBhcHJfdHlwZTogQVBSQXByVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IHRoYXQgaXMgc3ViamVjdGVkIHRvIHRoZSBBUFIgaWYgYSBiYWxhbmNlIHdhcyBjYXJyaWVkIGJleW9uZCBwYXltZW50IGR1ZSBkYXRlLiBIb3cgaXQgaXMgY2FsY3VsYXRlZCBjYW4gdmFyeSBieSBjYXJkIGlzc3Vlci4gSXQgaXMgb2Z0ZW4gY2FsY3VsYXRlZCBhcyBhbiBhdmVyYWdlIGRhaWx5IGJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYmFsYW5jZV9zdWJqZWN0X3RvX2FwcjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbW9uZXkgY2hhcmdlZCBkdWUgdG8gaW50ZXJlc3QgZnJvbSBsYXN0IHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jaGFyZ2VfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFQUkFwclR5cGVFbnVtIHtcbiAgICBCYWxhbmNlVHJhbnNmZXJBcHIgPSAnYmFsYW5jZV90cmFuc2Zlcl9hcHInLFxuICAgIENhc2hBcHIgPSAnY2FzaF9hcHInLFxuICAgIFB1cmNoYXNlQXByID0gJ3B1cmNoYXNlX2FwcicsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJ1xufVxuXG4vKipcbiAqIEFsbG93IG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGJ5IGFjY291bnQuIFVubGlzdGVkIChlLmcuIG1pc3NpbmcpIGFjY291bnRzIHdpbGwgYmUgY29uc2lkZXJlZCBgbmV3X2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBY2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgYWNjb3VudCBpZGVudGlmaWVyIGZvciB0aGlzIGFjY291bnQuIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGF0IHJldHVybmVkIGJ5IHRoZSBkYXRhIGFjY2VzcyBBUEkgZm9yIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QWNjZXNzXG4gICAgICovXG4gICAgdW5pcXVlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHNlZSB0aGlzIGFjY291bnQgKGFuZCBhc3NvY2lhdGVkIGRldGFpbHMsIGluY2x1ZGluZyBiYWxhbmNlKSBpbiB0aGUgbGlzdCBvZiBhY2NvdW50cyAgSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIGF1dGhvcml6ZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfcHJvZHVjdF9hY2Nlc3M/OiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QXNzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0SW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBc3NldHNBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBc3NldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBBc3NldFJlcG9ydEludmVzdG1lbnRzO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgb3duZXJzPzogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzPzogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGFuZCBleHBlY3RlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBhbmQgdGhlIEl0ZW0gY29udGFpbnMgb25lIG9yIG1vcmUgYWNjb3VudHMgd2l0aCBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgdHlwZSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIENhcGl0YWwgT25lIGRlcG9zaXRvcnkgYWNjb3VudHMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgYWNjb3VudCB0eXBlcyBvbiBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFNlZSBbYWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvciBhIGZ1bGwgbGlzdCBvZiBhY2NvdW50IHR5cGVzLiAgSWYgdGhlIGJhbGFuY2UgdGhhdCBpcyBwdWxsZWQgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wIGZvciBJdGVtcyB3aXRoIHRoaXMgZmllbGQgcmVxdWlyZWQsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgc2luZ2xlIGFjY291bnQgYXQgYSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEJhc2Uge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgZm9yIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gc2VsZWN0IGZyb20uIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gUGxhaWQgZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50IGZpbHRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnRzIHRoYXQgaWRlbnRpdHkgZGF0YSBpcyBkZXJ2aWVkIGZyb20uIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiBub25lIG9mIHRoZSBhY2NvdW50IGlkZW50aXR5IGlzIGZyb20gYSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnQ+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50cyB0aGF0IGlkZW50aXR5IGRhdGEgaXMgZGVydmllZCBmcm9tLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgbm9uZSBvZiB0aGUgYWNjb3VudCBpZGVudGl0eSBpcyBmcm9tIGEgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnQ+O1xufVxuLyoqXG4gKiBJZGVudGl0eSBtYXRjaCBzY29yZXMgZm9yIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBBdXRvbWF0ZWQgb3IgTWFudWFsIG1pY3JvLWRlcG9zaXRzLiAgUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogTmFtZU1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZU51bWJlck1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2VzcyB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X2RhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGJhbmsgc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHRheCBkb2N1bWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3Mgc3BlY2lmaWMgcHJvZHVjdHMgb24gdGhpcyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9kYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBiYW5rIHN0YXRlbWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHRheCBkb2N1bWVudHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgYWNjb3VudHMgYmUgbGltaXRlZCB0byBhIHNwZWNpZmljIGNhcmRpbmFsaXR5LiBgTVVMVElfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBtdWx0aXBsZSBhY2NvdW50cy4gYFNJTkdMRV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG9ubHkgYSBzaW5nbGUgYWNjb3VudC4gYEFMTGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIG11c3Qgc2hhcmUgYWxsIG9mIHRoZWlyIGFjY291bnRzIGFuZCBzaG91bGQgbm90IGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBkZS1zZWxlY3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTZWxlY3Rpb25DYXJkaW5hbGl0eSB7XG4gICAgU2luZ2xlU2VsZWN0ID0gJ1NJTkdMRV9TRUxFQ1QnLFxuICAgIE11bHRpU2VsZWN0ID0gJ01VTFRJX1NFTEVDVCcsXG4gICAgQWxsID0gJ0FMTCdcbn1cblxuLyoqXG4gKiBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U3VidHlwZSB7XG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgXzUyOSA9ICc1MjknLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIENhc2hJc2EgPSAnY2FzaCBpc2EnLFxuICAgIENyeXB0b0V4Y2hhbmdlID0gJ2NyeXB0byBleGNoYW5nZScsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgTGlmID0gJ2xpZicsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdsaWZlIGluc3VyYW5jZScsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVySW5zdXJhbmNlID0gJ290aGVyIGluc3VyYW5jZScsXG4gICAgT3RoZXJBbm51aXR5ID0gJ290aGVyIGFubnVpdHknLFxuICAgIFByaWYgPSAncHJpZicsXG4gICAgUmRzcCA9ICdyZHNwJyxcbiAgICBSZXNwID0gJ3Jlc3AnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUnJpZiA9ICdycmlmJyxcbiAgICBQZW5zaW9uID0gJ3BlbnNpb24nLFxuICAgIFByb2ZpdFNoYXJpbmdQbGFuID0gJ3Byb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFJldGlyZW1lbnQgPSAncmV0aXJlbWVudCcsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2VwSXJhID0gJ3NlcCBpcmEnLFxuICAgIFNpbXBsZUlyYSA9ICdzaW1wbGUgaXJhJyxcbiAgICBTaXBwID0gJ3NpcHAnLFxuICAgIFN0b2NrUGxhbiA9ICdzdG9jayBwbGFuJyxcbiAgICBUaHJpZnRTYXZpbmdzUGxhbiA9ICd0aHJpZnQgc2F2aW5ncyBwbGFuJyxcbiAgICBUZnNhID0gJ3Rmc2EnLFxuICAgIFRydXN0ID0gJ3RydXN0JyxcbiAgICBVZ21hID0gJ3VnbWEnLFxuICAgIFV0bWEgPSAndXRtYScsXG4gICAgVmFyaWFibGVBbm51aXR5ID0gJ3ZhcmlhYmxlIGFubnVpdHknLFxuICAgIENyZWRpdENhcmQgPSAnY3JlZGl0IGNhcmQnLFxuICAgIFBheXBhbCA9ICdwYXlwYWwnLFxuICAgIENkID0gJ2NkJyxcbiAgICBDaGVja2luZyA9ICdjaGVja2luZycsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBNb25leU1hcmtldCA9ICdtb25leSBtYXJrZXQnLFxuICAgIFByZXBhaWQgPSAncHJlcGFpZCcsXG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBDb25zdHJ1Y3Rpb24gPSAnY29uc3RydWN0aW9uJyxcbiAgICBDb25zdW1lciA9ICdjb25zdW1lcicsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgT3ZlcmRyYWZ0ID0gJ292ZXJkcmFmdCcsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIENhc2hNYW5hZ2VtZW50ID0gJ2Nhc2ggbWFuYWdlbWVudCcsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIE11dHVhbEZ1bmQgPSAnbXV0dWFsIGZ1bmQnLFxuICAgIFJlY3VycmluZyA9ICdyZWN1cnJpbmcnLFxuICAgIFJld2FyZHMgPSAncmV3YXJkcycsXG4gICAgU2FmZURlcG9zaXQgPSAnc2FmZSBkZXBvc2l0JyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAgaW5zdGVhZC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgb3RoZXI6YCBOb24tc3BlY2lmaWVkIGFjY291bnQgdHlwZSAgU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9kZXRhaWxzPzogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIHBheW1lbnQgZGV0YWlscy4gSWYgc2V0LCBhIHBheW1lbnQgcmlzayBhc3Nlc3NtZW50IGlzIHBlcmZvcm1lZCBhbmQgcmV0dXJuZWQgYXMgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRocmVzaG9sZCBwZXJjZW50YWdlIG9mIHRoZSBhY2NvdW50IGJhbGFuY2UgdXNlZCBmb3IgY29tcGFyaXNvbiB3aXRoIHRoZSByZXF1ZXN0ZWQgQUNIIGRlYml0IGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBiYWxhbmNlX3RocmVzaG9sZF9wZXJjZW50YWdlPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGlzIG9iamVjdCBwcm92aWRlcyBkZXRhaWxlZCByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudCB7XG4gICAgLyoqXG4gICAgICogQSBmaXZlLXRpZXIgcmlzayBhc3Nlc3NtZW50IGZvciB0aGUgdHJhbnNhY3Rpb24gYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IG9mIHJldHVybi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBBQ0ggZGViaXQgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIChzZXQgYnkgY3VzdG9tZXJzKSBvZiB0aGUgYXZhaWxhYmxlIG9yIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hY2NvdW50cy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnR9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Jpc2tfYXNzZXNzbWVudD86IEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24vYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpb25TdGF0ZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBBdHRlbXB0ID0gJ0FUVEVNUFQnLFxuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgICBTa2lwcGVkID0gJ1NLSVBQRUQnXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgY29uc2VudCBhY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWN0aXZpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjdGl2aXR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhY3Rpdml0eTogQWN0aXZpdHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYWN0aXZpdHkgd2FzIGluaXRpYXRlZCBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRlZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjdGl2aXR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFwcGxpY2F0aW9uIElEIG9mIHRoZSBjbGllbnQgd2hvIGluaXRpYXRlZCB0aGUgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpbml0aWF0b3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aW9uU3RhdGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc3RhdGU6IEFjdGlvblN0YXRlO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICB0YXJnZXRfYXBwbGljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHNjb3Blcz86IFNjb3Blc051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVHlwZXMgb2YgY29uc2VudCBhY3Rpdml0aWVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpdml0eVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSXRlbUNyZWF0ZSA9ICdJVEVNX0NSRUFURScsXG4gICAgSXRlbUltcG9ydCA9ICdJVEVNX0lNUE9SVCcsXG4gICAgSXRlbVVwZGF0ZSA9ICdJVEVNX1VQREFURScsXG4gICAgSXRlbVVubGluayA9ICdJVEVNX1VOTElOSycsXG4gICAgUG9ydGFsVW5saW5rID0gJ1BPUlRBTF9VTkxJTksnLFxuICAgIFBvcnRhbEl0ZW1zRGVsZXRlID0gJ1BPUlRBTF9JVEVNU19ERUxFVEUnLFxuICAgIEl0ZW1SZW1vdmUgPSAnSVRFTV9SRU1PVkUnLFxuICAgIEludmFyaWFudENoZWNrZXJEZWxldGlvbiA9ICdJTlZBUklBTlRfQ0hFQ0tFUl9ERUxFVElPTicsXG4gICAgU2NvcGVzVXBkYXRlID0gJ1NDT1BFU19VUERBVEUnXG59XG5cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCBmb3IgY29tbWVyY2lhbCBvciByZXNpZGVudGlhbCBwdXJwb3Nlcy4gIE5vdGU6IFRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAgd2hlbiBQbGFpZCBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3NcXCdzIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NQdXJwb3NlTGFiZWwge1xuICAgIFJlc2lkZW50aWFsID0gJ3Jlc2lkZW50aWFsJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBhcHBsaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgZ3JhbnRlZCBwcm9kdWN0aW9uIGFjY2VzcyBhdCBQbGFpZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGpvaW5fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgY2xpZW504oCZcyBicm9hZCB1c2UgY2FzZSBhcyBhc3Nlc3NlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHVzZV9jYXNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGllbnTigJlzIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBhbnlfbGVnYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNpdHkgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3N0YWwgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRlck5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXIge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXJzIHtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRvcl9pZGAgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0b3JfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiBUaGUgYGFzc2V0c2AgcHJvZHVjdCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBsaW5rOyB0aGUgQXNzZXRzIHByb2R1Y3QgY2Fubm90IGJlIGFkZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBJZiB1c2luZyBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eSwgYGRheXNfcmVxdWVzdGVkYCBtdXN0IGJlIGF0IGxlYXN0IDYxIGZvciBuZXcgb3JpZ2luYXRpb25zIG9yIGF0IGxlYXN0IDMxIGZvciByZWZpbmFuY2luZ3MuICBBbiBBc3NldCBSZXBvcnQgcmVxdWVzdGVkIHdpdGggXFxcIkFkZGl0aW9uYWwgSGlzdG9yeVxcXCIgKHRoYXQgaXMsIHdpdGggbW9yZSB0aGFuIDYxIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgd2lsbCBpbmN1ciBhbiBBZGRpdGlvbmFsIEhpc3RvcnkgZmVlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC4gVGhlIG9wdGlvbmFsIGB1c2VyYCBvYmplY3QgaXMgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogdHJ1ZSB0byByZXR1cm4gYmFsYW5jZSBhbmQgaWRlbnRpdHkgZWFybGllciBhcyBhIGZhc3QgcmVwb3J0LiBEZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2Zhc3RfcmVwb3J0PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZXQgcmVwb3J0LiBQb3NzaWJsZSB2YWx1ZXM6IGBcXFwiaW52ZXN0bWVudHNcXFwiYFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVXNlIHRoaXMgZmllbGQgdG8gcmVxdWVzdCBhIGBmYXN0X2Fzc2V0YCByZXBvcnQuIFdoZW4gRmFzdCBBc3NldHMgaXMgcmVxdWVzdGVkLCBQbGFpZCB3aWxsIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogZmlyc3QsIHRoZSBGYXN0IEFzc2V0IFJlcG9ydCwgd2hpY2ggd2lsbCBjb250YWluIG9ubHkgY3VycmVudCBpZGVudGl0eSBhbmQgYmFsYW5jZSBpbmZvcm1hdGlvbiwgYW5kIGxhdGVyLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgYWxzbyBjb250YWluIGhpc3RvcmljYWwgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgdHJhbnNhY3Rpb24gZGF0YS4gQSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vayB3aWxsIGJlIGZpcmVkIGZvciBlYWNoIEFzc2V0IFJlcG9ydCB3aGVuIGl0IGlzIHJlYWR5LCBhbmQgdGhlIGByZXBvcnRfdHlwZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB3ZWJob29rIGlzIGZpcmluZyBmb3IgdGhlIGBmdWxsYCBvciBgZmFzdGAgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCB3aXRoIGBmYXN0X3JlcG9ydGAgc2V0IHRvIGB0cnVlYC4gVGhlcmUgaXMgbm8gYWRkaXRpb25hbCBjaGFyZ2UgZm9yIHVzaW5nIEZhc3QgQXNzZXRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEFkZE9ucz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGFuIGFzc2V0IHJlcG9ydCBmb3IuIFRoZSBsYXRlc3QgYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB3aWxsIGJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBmZXRjaCBcXFwiZmFzdFxcXCIgdmVyc2lvbiBvZiBhc3NldCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuIENhbiBvbmx5IGJlIHVzZWQgaWYgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3YXMgY2FsbGVkIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBmYXN0X3JlcG9ydD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgaG9sZGluZ3MsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYW4gQXNzZXQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBc3NldHM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEFzc2V0cz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm5lZCBieSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIGFzc2V0IHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBUaGUgdXNlciBvYmplY3QgYWxsb3dzIHlvdSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIEFzc2V0IFJlcG9ydC4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFRoZSBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBhbmQgYHNzbmAgZmllbGRzIGFyZSByZXF1aXJlZCBpZiB5b3Ugd291bGQgbGlrZSB0aGUgUmVwb3J0IHRvIGJlIGVsaWdpYmxlIGZvciBGYW5uaWUgTWFl4oCZcyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgZmlyc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWUuICBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgU29jaWFsIFNlY3VyaXR5IE51bWJlci4gUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiAgRm9ybWF0OiBcXFwiZGRkLWRkLWRkZGRcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcuLi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVUQUlMOiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFU0NSSVBUT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIENhdGVnb3J5IFR5cGUgRW51bWVyYXRlZCBkZXJpdmVkIGJ5IFZlbmRvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGUge1xuICAgIEF0bUZlZSA9ICdBVE1GZWUnLFxuICAgIEFkdmVydGlzaW5nID0gJ0FkdmVydGlzaW5nJyxcbiAgICBBaXJUcmF2ZWwgPSAnQWlyVHJhdmVsJyxcbiAgICBBbGNvaG9sQmFycyA9ICdBbGNvaG9sQmFycycsXG4gICAgQWxsb3dhbmNlID0gJ0FsbG93YW5jZScsXG4gICAgQW11c2VtZW50ID0gJ0FtdXNlbWVudCcsXG4gICAgQXJ0cyA9ICdBcnRzJyxcbiAgICBBdXRvVHJhbnNwb3J0ID0gJ0F1dG9UcmFuc3BvcnQnLFxuICAgIEF1dG9JbnN1cmFuY2UgPSAnQXV0b0luc3VyYW5jZScsXG4gICAgQXV0b1BheW1lbnQgPSAnQXV0b1BheW1lbnQnLFxuICAgIEJhYnlTdXBwbGllcyA9ICdCYWJ5U3VwcGxpZXMnLFxuICAgIEJhYnlzaXR0ZXJEYXljYXJlID0gJ0JhYnlzaXR0ZXJEYXljYXJlJyxcbiAgICBCYW5rRmVlID0gJ0JhbmtGZWUnLFxuICAgIEJpbGxzVXRpbGl0aWVzID0gJ0JpbGxzVXRpbGl0aWVzJyxcbiAgICBCb251cyA9ICdCb251cycsXG4gICAgQm9va3NTdXBwbGllcyA9ICdCb29rc1N1cHBsaWVzJyxcbiAgICBCdXNpbmVzc1NlcnZpY2VzID0gJ0J1c2luZXNzIFNlcnZpY2VzJyxcbiAgICBCdXkgPSAnQnV5JyxcbiAgICBDYXNoQXRtID0gJ0Nhc2hBVE0nLFxuICAgIENoYXJpdHkgPSAnQ2hhcml0eScsXG4gICAgQ2hlY2sgPSAnQ2hlY2snLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDaGlsZFN1cHBvcnQnLFxuICAgIENsb3RoaW5nID0gJ0Nsb3RoaW5nJyxcbiAgICBDb2ZmZWVTaG9wcyA9ICdDb2ZmZWVTaG9wcycsXG4gICAgQ3JlZGl0Q2FyZFBheW1lbnQgPSAnQ3JlZGl0Q2FyZFBheW1lbnQnLFxuICAgIERlbnRpc3QgPSAnRGVudGlzdCcsXG4gICAgRG9jdG9yID0gJ0RvY3RvcicsXG4gICAgRWR1Y2F0aW9uID0gJ0VkdWNhdGlvbicsXG4gICAgRWxlY3Ryb25pY3NTb2Z0d2FyZSA9ICdFbGVjdHJvbmljc1NvZnR3YXJlJyxcbiAgICBFbnRlcnRhaW5tZW50ID0gJ0VudGVydGFpbm1lbnQnLFxuICAgIEV5ZWNhcmUgPSAnRXllY2FyZScsXG4gICAgRmFzdEZvb2QgPSAnRmFzdEZvb2QnLFxuICAgIEZlZGVyYWxUYXggPSAnRmVkZXJhbFRheCcsXG4gICAgRmVlc0NoYXJnZXMgPSAnRmVlc0NoYXJnZXMnLFxuICAgIEZpbmFuY2VDaGFyZ2UgPSAnRmluYW5jZUNoYXJnZScsXG4gICAgRmluYW5jaWFsID0gJ0ZpbmFuY2lhbCcsXG4gICAgRmluYW5jaWFsQWR2aXNvciA9ICdGaW5hbmNpYWxBZHZpc29yJyxcbiAgICBGb29kRGluaW5nID0gJ0Zvb2REaW5pbmcnLFxuICAgIEZ1cm5pc2hpbmdzID0gJ0Z1cm5pc2hpbmdzJyxcbiAgICBHYXNGdWVsID0gJ0dhc0Z1ZWwnLFxuICAgIEdpZnRzRG9uYXRpb25zID0gJ0dpZnRzRG9uYXRpb25zJyxcbiAgICBHcm9jZXJpZXMgPSAnR3JvY2VyaWVzJyxcbiAgICBHeW0gPSAnR3ltJyxcbiAgICBIYWlyID0gJ0hhaXInLFxuICAgIEhlYWx0aEZpdG5lc3MgPSAnSGVhbHRoRml0bmVzcycsXG4gICAgSGVhbHRoSW5zdXJhbmNlID0gJ0hlYWx0aEluc3VyYW5jZScsXG4gICAgSG9iYmllcyA9ICdIb2JiaWVzJyxcbiAgICBIb21lID0gJ0hvbWUnLFxuICAgIEhvbWVJbXByb3ZlbWVudCA9ICdIb21lSW1wcm92ZW1lbnQnLFxuICAgIEhvbWVJbnN1cmFuY2UgPSAnSG9tZUluc3VyYW5jZScsXG4gICAgSG9tZVBob25lID0gJ0hvbWVQaG9uZScsXG4gICAgSG9tZVNlcnZpY2VzID0gJ0hvbWVTZXJ2aWNlcycsXG4gICAgSG9tZVN1cHBsaWVzID0gJ0hvbWVTdXBwbGllcycsXG4gICAgSG90ZWwgPSAnSG90ZWwnLFxuICAgIEluY29tZSA9ICdJbmNvbWUnLFxuICAgIEludGVyZXN0SW5jb21lID0gJ0ludGVyZXN0SW5jb21lJyxcbiAgICBJbnRlcm5ldCA9ICdJbnRlcm5ldCcsXG4gICAgSW52ZXN0bWVudHMgPSAnSW52ZXN0bWVudHMnLFxuICAgIEtpZHMgPSAnS2lkcycsXG4gICAgS2lkc0FjdGl2aXRpZXMgPSAnS2lkc0FjdGl2aXRpZXMnLFxuICAgIExhdGVGZWUgPSAnTGF0ZUZlZScsXG4gICAgTGF1bmRyeSA9ICdMYXVuZHJ5JyxcbiAgICBMYXduR2FyZGVuID0gJ0xhd25HYXJkZW4nLFxuICAgIExlZ2FsID0gJ0xlZ2FsJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ0xpZmVJbnN1cmFuY2UnLFxuICAgIExvYW5JbnN1cmFuY2UgPSAnTG9hbkluc3VyYW5jZScsXG4gICAgTG9hblBheW1lbnQgPSAnTG9hblBheW1lbnQnLFxuICAgIExvYW5zID0gJ0xvYW5zJyxcbiAgICBNb2JpbGVQaG9uZSA9ICdNb2JpbGVQaG9uZScsXG4gICAgTW9ydGdhZ2VSZW50ID0gJ01vcnRnYWdlUmVudCcsXG4gICAgTW92aWVzRHZkcyA9ICdNb3ZpZXNEVkRzJyxcbiAgICBNdXNpYyA9ICdNdXNpYycsXG4gICAgTmV3c3BhcGVyc01hZ2F6aW5lcyA9ICdOZXdzcGFwZXJzTWFnYXppbmVzJyxcbiAgICBPZmZpY2VTdXBwbGllcyA9ICdPZmZpY2VTdXBwbGllcycsXG4gICAgUGFya2luZyA9ICdQYXJraW5nJyxcbiAgICBQYXljaGVjayA9ICdQYXljaGVjaycsXG4gICAgUGVyc29uYWxDYXJlID0gJ1BlcnNvbmFsQ2FyZScsXG4gICAgUGV0Rm9vZFN1cHBsaWVzID0gJ1BldEZvb2RTdXBwbGllcycsXG4gICAgUGV0R3Jvb21pbmcgPSAnUGV0R3Jvb21pbmcnLFxuICAgIFBldHMgPSAnUGV0cycsXG4gICAgUGhhcm1hY3kgPSAnUGhhcm1hY3knLFxuICAgIFByaW50aW5nID0gJ1ByaW50aW5nJyxcbiAgICBQcm9wZXJ0eVRheCA9ICdQcm9wZXJ0eSBUYXgnLFxuICAgIFB1YmxpY1RyYW5zcG9ydGF0aW9uID0gJ1B1YmxpYyBUcmFuc3BvcnRhdGlvbicsXG4gICAgUmVpbWJ1cnNlbWVudCA9ICdSZWltYnVyc2VtZW50JyxcbiAgICBSZW50YWxDYXJUYXhpID0gJ1JlbnRhbENhclRheGknLFxuICAgIFJlc3RhdXJhbnRzID0gJ1Jlc3RhdXJhbnRzJyxcbiAgICBTYWxlc1RheCA9ICdTYWxlc1RheCcsXG4gICAgU2VydmljZVBhcnRzID0gJ1NlcnZpY2VQYXJ0cycsXG4gICAgU2VydmljZUZlZSA9ICdTZXJ2aWNlRmVlJyxcbiAgICBTaGlwcGluZyA9ICdTaGlwcGluZycsXG4gICAgU2hvcHBpbmcgPSAnU2hvcHBpbmcnLFxuICAgIFNwYU1hc3NhZ2UgPSAnU3BhTWFzc2FnZScsXG4gICAgU3BvcnRpbmdHb29kcyA9ICdTcG9ydGluZ0dvb2RzJyxcbiAgICBTcG9ydHMgPSAnU3BvcnRzJyxcbiAgICBTdGF0ZVRheCA9ICdTdGF0ZVRheCcsXG4gICAgU3R1ZGVudExvYW4gPSAnU3R1ZGVudCBMb2FuJyxcbiAgICBUYXhlcyA9ICdUYXhlcycsXG4gICAgVGVsZXZpc2lvbiA9ICdUZWxldmlzaW9uJyxcbiAgICBUb3lzID0gJ1RveXMnLFxuICAgIFRyYW5zZmVyID0gJ1RyYW5zZmVyJyxcbiAgICBUcmF2ZWwgPSAnVHJhdmVsJyxcbiAgICBUdWl0aW9uID0gJ1R1aXRpb24nLFxuICAgIFVuY2F0ZWdvcml6ZWQgPSAnVW5jYXRlZ29yaXplZCcsXG4gICAgVXRpbGl0aWVzID0gJ1V0aWxpdGllcycsXG4gICAgVmFjYXRpb24gPSAnVmFjYXRpb24nLFxuICAgIFZldGVyaW5hcnkgPSAnVmV0ZXJpbmFyeSdcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbiB7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGVzY3JpcHRpb24gU3RyaW5nIHVwIHRvIDMgb2NjdXJhbmNlcyAxIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvblxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVW5pcXVlSWRlbnRpZmllcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIEFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25EYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gUG9zdCBEYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUG9zdERhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVHlwZTogQXNzZXRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGUgd2l0aCB3aG8gZGlkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblBhaWRCeU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgUHJvdmlkZWQgLSBleGFtcGxlcyBhcmUgYXRtLCBjYXNoLCBjaGVjaywgY3JlZGl0LCBkZWJpdCwgZGVwb3NpdCwgZGlyZWN0RGViaXQsIGRpcmVjdERlcG9zaXQsIGRpdmlkZW5kLCBmZWUsIGludGVyZXN0LCBvdGhlciwgcGF5bWVudCwgcG9pbnRPZlNhbGUsIHJlcGVhdFBheW1lbnQsIHNlcnZpY2VDaGFyZ2UsIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uVHlwZUFkZGl0aW9uYWxEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGU6IEFzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZJIHByb3ZpZGVkIFRyYW5zYWN0aW9uIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNhY3Rpb25JZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldCBUcmFuc2FjdGlvbiBUeXBlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvblR5cGUge1xuICAgIENyZWRpdCA9ICdDcmVkaXQnLFxuICAgIERlYml0ID0gJ0RlYml0J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OOiBBcnJheTxBc3NldFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgc3BlY2lmaWVzIGZpbmFuY2lhbCBhc3NldHMgaW4gYSBtb3J0Z2FnZSBsb2FuIHRyYW5zYWN0aW9uLiBBc3NldHMgbWF5IGJlIGVpdGhlciBsaXF1aWQgb3IgZml4ZWQgYW5kIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGFzc2V0IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0VHlwZSB7XG4gICAgQ2hlY2tpbmdBY2NvdW50ID0gJ0NoZWNraW5nQWNjb3VudCcsXG4gICAgU2F2aW5nc0FjY291bnQgPSAnU2F2aW5nc0FjY291bnQnLFxuICAgIEludmVzdG1lbnQgPSAnSW52ZXN0bWVudCcsXG4gICAgTW9uZXlNYXJrZXRGdW5kID0gJ01vbmV5TWFya2V0RnVuZCcsXG4gICAgT3RoZXIgPSAnT3RoZXInXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8QXNzZXQ+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIFRoZSByZXN1bHRpbmcgYGVycm9yYCB3aWxsIGhhdmUgYW4gYGVycm9yX3R5cGVgIG9mIGBBU1NFVF9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgYC9hc3NldF9yZXBvcnQvZ2V0YCBpcyByZWFkeSB0byBiZSBjYWxsZWQuICBJZiB5b3UgYXR0ZW1wdCB0byByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgYmVmb3JlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHlvdeKAmWxsIHJlY2VpdmUgYSByZXNwb25zZSB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDQwMCBhbmQgYSBQbGFpZCBlcnJvciBjb2RlIG9mIGBQUk9EVUNUX05PVF9SRUFEWWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVNTRVRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFzc2V0IFJlcG9ydCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVwb3J0IHR5cGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgQXNzZXQgUmVwb3J0IGlzIGEgYGZ1bGxgIG9yIGBmYXN0YCByZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRzYC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQkFDUykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgYW55IGBhY2NvdW50c2AgZm9yIHdoaWNoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCB0aGUgYXJyYXkgZm9yIHRoYXQgdHlwZSB3aWxsIGJlIGVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBBQ0ggbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDSD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNoOiBBcnJheTxOdW1iZXJzQUNIPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBFRlQgbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0VGVD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgZWZ0OiBBcnJheTxOdW1iZXJzRUZUPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBJQkFOIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsOiBBcnJheTxOdW1iZXJzSW50ZXJuYXRpb25hbD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgQkFDUyBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQkFDUz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjczogQXJyYXk8TnVtYmVyc0JBQ1M+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXV0aEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXV0aC9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgdmVyaWZpZWQgdmlhIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cy4gV2UgcmVjb21tZW5kIGNvbW11bmljYXRpbmcgdG8geW91ciB1c2VycyB3aGVuIHRoaXMgZXZlbnQgaXMgcmVjZWl2ZWQgdG8gbm90aWZ5IHRoZW0gdGhhdCB0aGVpciBhY2NvdW50IGlzIHZlcmlmaWVkIGFuZCByZWFkeSBmb3IgdXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgaW4gQ1JBIGVuYWJsZWQgY2xpZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZUNvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVmcmVzaCByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlZnJlc2hlZCBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC4gVG8gZ2V0IHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIHZpYSB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgaXMgZGV0ZWN0ZWQuIFlvdSBzaG91bGQgY2FsbCBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCB0byBnZXQgdXBkYXRlZCBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuIFRvIHJlY2VpdmUgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgaW4gdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIGBiYW5rX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZWlnaHQgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMCUgLSAwLjUlICAgMjogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuNSUgLSAxLjUlICAgMzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDEuNSUgLSAzJSAgIDQ6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAzJSAtIDUlICAgNTogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDUlIC0gMTAlICAgNjogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDEwJSAtIDE1JSAgIDc6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxNSUgYW5kIDUwJSAgIDg6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDUwJSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHJpc2tfdGllcjogbnVtYmVyO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgYmFuayB0cmFuc2ZlciB3aXRoaW4gdGhlIEJhbmsgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzOiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0aGF0IHNob3VsZCBiZSBjcmVkaXRlZC9kZWJpdGVkIGZvciB0aGlzIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgYmFuayB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgc3RhdHVzOiBCYW5rVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IEJhbmtUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXN0b20gdGFnIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIGNyZWF0ZSByZXF1ZXN0LiBXaWxsIGJlIG51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGN1c3RvbV90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsYW5jZSBvZiBhIGJhbmsgdHJhbnNmZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhdmFpbGFibGUgYmFsYW5jZSAtIHRoZSBzdW0gb2YgYWxsIHN1Y2Nlc3NmdWwgZGViaXQgdHJhbnNmZXIgYW1vdW50cyBtaW51cyBhbGwgY3JlZGl0IHRyYW5zZmVyIGFtb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHRyYW5zYWN0YWJsZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBtdWx0aXBsZSBvcmlnaW5hdGlvbiBhY2NvdW50cyBhcmUgYXZhaWxhYmxlLCBgb3JpZ2luYXRpb25fYWNjb3VudF9pZGAgbXVzdCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgZm9yIHdoaWNoIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogQmFua1RyYW5zZmVyQmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IOKAkyBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGAgZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzLCBvciBgaW5ib3VuZGAgZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB7XG4gICAgT3V0Ym91bmQgPSAnb3V0Ym91bmQnLFxuICAgIEluYm91bmQgPSAnaW5ib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIEJhbmsgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV2ZW50LiBJRHMgYXJlIHNlcXVlbnRpYWwgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogQmFua1RyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJhbmsgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgeW91ciBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRMaXN0QmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGA6IGZvciBBUEktaW5pdGlhdGVkIHRyYW5zZmVycyBgaW5ib3VuZGA6IGZvciBwYXltZW50cyByZWNlaXZlZCBieSB0aGUgRkJPIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3REaXJlY3Rpb24ge1xuICAgIEluYm91bmQgPSAnaW5ib3VuZCcsXG4gICAgT3V0Ym91bmQgPSAnb3V0Ym91bmQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8vZnJvbSBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfdHlwZT86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZnNldCBpbnRvIHRoZSBsaXN0IG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciB0cmFuc2ZlcnMgZnJvbSBhIHNwZWNpZmljIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudExpc3REaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJFdmVudExpc3REaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgYmFuayB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSB0eXBlIG9mIHRoaXMgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldmVyc2VkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRmFpbHVyZSB7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBiYW5rIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIG9yaWdpbmF0ZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJzOiBBcnJheTxCYW5rVHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCwgYHNhbWUtZGF5LWFjaGAsIG9yIGB3aXJlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXAgZGVzY3JpYmVzIGEgc3dlZXAgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXAge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IEJhbmtUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBtdWx0aXBsZSBvcmlnaW5hdGlvbiBhY2NvdW50cyBhcmUgYXZhaWxhYmxlLCBgb3JpZ2luYXRpb25fYWNjb3VudF9pZGAgbXVzdCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgdGhhdCB0aGUgc3dlZXBzIGJlbG9uZyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2VlcHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXBzOiBBcnJheTxCYW5rVHJhbnNmZXJTd2VlcD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB0aGUgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlcuKAmXMgZnVsbCBsZWdhbCBuYW1lLiBJZiB0aGUgdHJhbnNmZXIgYGFjaF9jbGFzc2AgaXMgYGNjZGAsIHRoaXMgc2hvdWxkIGJlIHRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBhY2NvdW50IGhvbGRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlcuKAmXMgZW1haWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlclxcJ3Mgcm91dGluZyBudW1iZXIuIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGluIHJlc3BvbnNlIGRhdGEuIERvIG5vdCBwcm92aWRlIHRoaXMgZmllbGQgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBiYW5rIHRyYW5zZmVyIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgQUNIIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBUbyBiZWdpbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgbXVzdCBmaXJzdCByZWdpc3RlciB5b3VyIHdlYmhvb2sgbGlzdGVuZXIgZW5kcG9pbnQgdmlhIHRoZSBbd2ViaG9va3MgcGFnZSBpbiB0aGUgRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS93ZWJob29rcykuIFRoZSBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWAgd2ViaG9vayBjYW4gYmUgdXNlZCB0byB0cmFjayB0aGUgcHJvZ3Jlc3Mgb2YgQUNIIHRyYW5zZmVycyB1c2VkIGluIFttaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbl0oL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AuIE5vdGUgdGhhdCBbVHJhbnNmZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIGN1c3RvbWVycyBzaG91bGQgdXNlIFRyYW5zZmVyIHdlYmhvb2tzIGluc3RlYWQgb2YgdXNpbmcgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgOyBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoIHtcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBCYXNlIFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEJhc2UgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRhdGVfZ2VuZXJhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEJhc2UgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SXRlbT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8QmFzZVJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBCYXNlIFJlcG9ydCBlbmRwb2ludHMuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzaGlwX3R5cGU6IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBCYXNlIFJlcG9ydCBlbmRwb2ludHMgYW5kIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IGBicm9rZXJhZ2VgIG9yIGBpbnZlc3RtZW50YCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM6IEFycmF5PEhpc3RvcmljYWxCYWxhbmNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2luc2lnaHRzPzogQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0cztcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxcJ3MgYmFsYW5jZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGFuZCBleHBlY3RlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBhbmQgdGhlIEl0ZW0gY29udGFpbnMgb25lIG9yIG1vcmUgYWNjb3VudHMgd2l0aCBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgdHlwZSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIENhcGl0YWwgT25lIGRlcG9zaXRvcnkgYWNjb3VudHMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgYWNjb3VudCB0eXBlcyBvbiBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFNlZSBbYWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvciBhIGZ1bGwgbGlzdCBvZiBhY2NvdW50IHR5cGVzLiAgSWYgdGhlIGJhbGFuY2UgdGhhdCBpcyBwdWxsZWQgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wIGZvciBJdGVtcyB3aXRoIHRoaXMgZmllbGQgcmVxdWlyZWQsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZm9yIHRoZSBlbnRpcmUgcmVwb3J0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIG9mIGVhY2ggY2FsZW5kYXIgbW9udGhcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9tb250aGx5X2JhbGFuY2VzPzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBmcm9tIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RoaXJ0eV9kYXlfYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIG9mIGVhY2ggY2FsZW5kYXIgbW9udGhcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzQWxsT2ZcbiAgICAgKi9cbiAgICBhdmVyYWdlX21vbnRobHlfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZyb20gdGhlIG1vc3QgcmVjZW50IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzQWxsT2ZcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIGRheXMgYXZhaWxhYmxlIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2RheXNfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTG9uZ2VzdCBnYXAgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvbmdlc3RfZ2FwX2JldHdlZW5fdHJhbnNhY3Rpb25zPzogQXJyYXk8QmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkZWJpdHMgaW50byB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9pbmZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfaW5mbG93X2Ftb3VudD86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXQgaW50byB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9vdXRmbG93cz86IEFycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9vdXRmbG93X2Ftb3VudD86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBubyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2RheXNfbm9fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBdmVyYWdlIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IG9yIGRlYml0IHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFkZGVkIGZvciBkZXBvc2l0b3J5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5O1xufVxuLyoqXG4gKiBBdmVyYWdlIGJhbGFuY2UgaW4gZG9sbGFyIGFtb3VudCBwZXIgbW9udGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEJhc2VSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhc2VSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBCYXNlIFJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0dXJuZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxCYXNlUmVwb3J0V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBJdGVtIHdpdGhpbiBhIEJhc2UgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2xhc3RfdXBkYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgZWFjaCBvZiB0aGUgYWNjb3VudHMgb3BlbiBvbiB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxCYXNlUmVwb3J0QWNjb3VudD47XG59XG4vKipcbiAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBwZXIgY2FsZW5kYXIgbW9udGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMYXJnZXN0IG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXM/OiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBhZGRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50IGZvciB0aGlzIHRpbWUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgQmFzZSBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY3JlZGl0X2NhdGVnb3J5PzogQ3JlZGl0Q2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gQmFzZSBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBCYXNlIFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQVNFX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IEJhc2VSZXBvcnRXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBPV05FUlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IGFjY291bnQtb3duZXIgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgdHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFzZVJlcG9ydFdhcm5pbmdDb2RlIHtcbiAgICBPd25lcnNVbmF2YWlsYWJsZSA9ICdPV05FUlNfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEJBU0VfUkVQT1JUX0VSUk9SYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJBU0VfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgQmFzZSBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQgYmVmb3JlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHlvdeKAmWxsIHJlY2VpdmUgYSByZXNwb25zZSB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDQwMCBhbmQgYSBQbGFpZCBlcnJvciBjb2RlIG9mIGBQUk9EVUNUX05PVF9SRUFEWWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJBU0VfUkVQT1JUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWxTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2U7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHlwZSBpbmRpY2F0aW5nIHdoYXQgY2F1c2VkIGEgcmVzb3VyY2UgdG8gYmUgY2hhbmdlZCBvciB1cGRhdGVkLiAgIGBkYXNoYm9hcmRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYnkgYSBtZW1iZXIgb2YgeW91ciB0ZWFtIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgYGFwaWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCB2aWEgdGhlIFBsYWlkIEFQSS4gIGBzeXN0ZW1gIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXV0b21hdGljYWxseSBieSBhIHBhcnQgb2YgdGhlIFBsYWlkIEJlYWNvbiBzeXN0ZW0uIEZvciBleGFtcGxlLCBpZiBhbm90aGVyIGJ1c2luZXNzIHVzaW5nIFBsYWlkIEJlYWNvbiBjcmVhdGVkIGEgZnJhdWQgcmVwb3J0IHRoYXQgbWF0Y2hlZCBvbmUgb2YgeW91ciB1c2VycywgeW91ciBtYXRjaGluZyB1c2VyXFwncyBzdGF0dXMgd291bGQgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGFuZCB0aGUgYXVkaXQgdHJhaWwgc291cmNlIHdvdWxkIGJlIGBzeXN0ZW1gLiAgYGJ1bGtfaW1wb3J0YCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGFzIHBhcnQgb2YgYSBidWxrIGltcG9ydCBwcm9jZXNzLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBjb21wYW55IHByb3ZpZGVkIGEgQ1NWIG9mIHVzZXIgZGF0YSBhcyBwYXJ0IG9mIHlvdXIgaW5pdGlhbCBvbmJvYXJkaW5nLCB0aGUgYXVkaXQgdHJhaWwgc291cmNlIHdvdWxkIGJlIGBidWxrX2ltcG9ydGAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25BdWRpdFRyYWlsU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBBcGkgPSAnYXBpJyxcbiAgICBTeXN0ZW0gPSAnc3lzdGVtJyxcbiAgICBCdWxrSW1wb3J0ID0gJ2J1bGtfaW1wb3J0J1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBjcmVhdGVkIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiBtYXRjaGVzIG9uZSBvZiB5b3VyIGV4aXN0aW5nIHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERVUExJQ0FURV9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fZHVwbGljYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBEdXBsaWNhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ/OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2VycyBpcyBmaXJzdCByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX0NSRUFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIEJlYWNvbiBSZXBvcnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydHM6IEFycmF5PEJlYWNvblJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIHJlcG9ydDogQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcztcbn1cbi8qKlxuICogQW5hbHlzaXMgb2Ygd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCB3YXMgc3luZGljYXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZXBvcnQgY3JlYXRlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgbWF0Y2hlcyB3aXRoIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfU1lORElDQVRJT05fQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gcmVwcmVzZW50cyBhIEJlYWNvbiBSZXBvcnQgY3JlYXRlZCBlaXRoZXIgYnkgeW91ciBvcmdhbml6YXRpb24gb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIgeW91XFwndmUgY3JlYXRlZC4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCB3YXMgc3luZGljYXRlZCB0by4gIFRoZSBgcmVwb3J0YCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgY29udGFpbnMgYSBzdWJzZXQgb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X3N5bmRpY2F0aW9uczogQXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgaW5mb3JtYXRpb24gZnJvbSBhIEJlYWNvbiBSZXBvcnQgdGhhdCBoYXMgYmVlbiBzeW5kaWNhdGVkIHRvIGEgbWF0Y2hpbmcgQmVhY29uIFVzZXIgaW4geW91ciBwcm9ncmFtLiAgVGhlIGBpZGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGlzIHRoZSBJRCBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0IHRoYXQgd2FzIHN5bmRpY2F0ZWQuIElmIHRoZSBvcmlnaW5hbCByZXBvcnQgd2FzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24sIHRoZSBmaWVsZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBJRCBvZiB0aGUgcmVwb3J0LiBPdGhlcndpc2UsIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYCBpbmRpY2F0aW5nIHRoYXQgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSBhbm90aGVyIEJlYWNvbiBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGB1bmtub3duYDogSWYgeW91IGFyZW5cXCd0IHN1cmUgd2hvIGNvbW1pdHRlZCB0aGUgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25SZXBvcnRUeXBlIHtcbiAgICBGaXJzdFBhcnR5ID0gJ2ZpcnN0X3BhcnR5JyxcbiAgICBTdG9sZW4gPSAnc3RvbGVuJyxcbiAgICBTeW50aGV0aWMgPSAnc3ludGhldGljJyxcbiAgICBBY2NvdW50VGFrZW92ZXIgPSAnYWNjb3VudF90YWtlb3ZlcicsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgZXhpc3RpbmcgQmVhY29uIFJlcG9ydHMgaGFzIGJlZW4gbW9kaWZpZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuICBUaGUgcHJpbWFyeSB1c2UgZm9yIHRoaXMgZW5kcG9pbnQgaXMgdG8gYWRkIGEgbmV3IGVuZCB1c2VyIHRvIEJlYWNvbiBmb3IgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYWxzbyBiZSB1c2VkIHRvIGltcG9ydCBoaXN0b3JpY2FsIGZyYXVkIGNhc2VzIGludG8gdGhlIEJlYWNvbiBOZXR3b3JrIHdpdGhvdXQgYmVpbmcgY2hhcmdlZCBmb3IgY3JlYXRpbmcgYSBCZWFjb24gVXNlci4gVG8gaW1wb3J0IGhpc3RvcmljYWwgZnJhdWQgY2FzZXMsIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIG9wdGlvbmFsIGByZXBvcnRgIHNlY3Rpb24gb2YgdGhlIHJlcXVlc3QgcGF5bG9hZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIElEIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlcklETnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlcklETnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBpZGVudGl0eSBkb2N1bWVudCB2YWx1ZSB0eXBlZCBpbiBieSB1c2VyLiBBbHBoYS1udW1lcmljLCB3aXRoIGFsbCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgc3RyaXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXJcXCdzIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBjaGVjayBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGF0YSB7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU6IEJlYWNvblVzZXJOYW1lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciBSZXZpc2lvbiBpZGVudGlmaWVzIGEgQmVhY29uIFVzZXIgYXQgc29tZSBwb2ludCBpbiBpdHMgcmV2aXNpb24gaGlzdG9yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXZpc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBgcmVqZWN0ZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gcmVqZWN0ZWQgZm9yIGZyYXVkLiBVc2VycyBjYW4gYmUgYXV0b21hdGljYWxseSBvciBtYW51YWxseSByZWplY3RlZC4gIGBwZW5kaW5nX3Jldmlld2A6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBtYXJrZWQgZm9yIHJldmlldy4gIGBjbGVhcmVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIGNsZWFyZWQgb2YgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25Vc2VyU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciB3aGVuIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YTtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YSB7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQVjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDYXRlZ29yaWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NhdGVnb3JpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdHJhbnNhY3Rpb24gY2F0ZWdvcmllcyB1c2VkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3JpZXM6IEFycmF5PENhdGVnb3J5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgdHJhbnNhY3Rpb24gY2F0ZWdvcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgY2F0ZWdvcnkuIGBjYXRlZ29yeV9pZGAgaXMgYSBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lcmNoYW50IGNhdGVnb3J5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgcGxhY2VgIGZvciBwaHlzaWNhbCB0cmFuc2FjdGlvbnMgb3IgYHNwZWNpYWxgIGZvciBvdGhlciB0cmFuc2FjdGlvbnMgc3VjaCBhcyBiYW5rIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBncm91cDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgYGNhdGVnb3J5X2lkYCBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGhpZXJhcmNoeTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQ2F0ZWdvcnkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5IHNvcnRlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG9wX2NvdW50ZXJwYXJ0aWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb24gYSB1c2VyXFwncyB0b3AgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgcmFua2VkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHRzXG4gICAgICovXG4gICAgcHJpbWFyeV9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5zaWdodHMgb2YgdG9wIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIEFzc2V0cyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlQWxsT2ZcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbmhhbmNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdHJhbnNhY3Rpb24gaWRlbnRpZmllciB0byB0aWUgdHJhbnNhY3Rpb25zIGJhY2sgdG8gY2xpZW50c1xcJyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VuaGFuY2VtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5oYW5jZW1lbnRzOiBFbmhhbmNlbWVudHM7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVucmljaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiBhcyBwcm92aWRlZCBieSB5b3UgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCk6LiAgIE5lZ2F0aXZlICgtKSBmb3IgY3JlZGl0cyAoZS5nLiwgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzKSAgIFBvc2l0aXZlICgrKSBmb3IgZGViaXRzIChlLmcuLCBwdXJjaGFzZXMsIGZlZXMsIG91dGdvaW5nIHRyYW5zZmVycylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5yaWNoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF91c2VyX2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBJZiB5b3UgaGF2ZSBsb2NhdGlvbiBkYXRhIGluIGF2YWlsYWJsZSBhbiB1bnN0cnVjdHVyZWQgZm9ybWF0LCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMCkuIFdoZW4gdGVzdGluZyBFbnJpY2gsIG5vdGUgdGhhdCBgYW1vdW50YCBkYXRhIHNob3VsZCBiZSByZWFsaXN0aWMuIFVucmVhbGlzdGljIG9yIGluYWNjdXJhdGUgYGFtb3VudGAgZGF0YSBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcXVhbGl0eSBvdXRwdXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBjb2RlcyAoTUNDcykgYXJlIGZvdXItZGlnaXQgbnVtYmVycyB0aGF0IGRlc2NyaWJlIGEgbWVyY2hhbnRcXCdzIHByaW1hcnkgYnVzaW5lc3MgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWNjPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gIFVzZSB0aGlzIGZpZWxkIHRvIHBhc3MgaW4gc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB5b3UgbWF5IGhhdmUgYWJvdXQgeW91ciB0cmFuc2FjdGlvbnMuIFByb3ZpZGluZyBsb2NhdGlvbiBkYXRhIGlzIG9wdGlvbmFsIGJ1dCBjYW4gaW5jcmVhc2UgcmVzdWx0IHF1YWxpdHkuIElmIHlvdSBoYXZlIHVuc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHJlYXNvbiBhIGNvbnN1bWVyIHJlcG9ydCBpcyBjcmVhdGVkIGZvciAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYEFDQ09VTlRfUkVWSUVXX05PTl9DUkVESVRgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgb2YgdGhlIGluZm9ybWF0aW9uIHRvIHJldmlldyBhIG5vbi1jcmVkaXQgYWNjb3VudCBwcm92aWRlZCBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc3VtZXIgY29udGludWVzIHRvIG1lZXQgdGhlIHRlcm1zIG9mIHRoZSBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoMikuIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiBgRVhURU5TSU9OX09GX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNyZWRpdCB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgYW5kIGludm9sdmluZyB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIGluIGNvbm5lY3Rpb24gd2l0aCBhIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMgaW4gY29ubmVjdGlvbiB3aXRoIGEgcHJvcGVydHkgcmVudGFsIGFzc2Vzc21lbnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYFdSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHRvIGV2YWx1YXRlIGFuIGFwcGxpY2F0aW9u4oCZcyBwcm9maWxlIHRvIG1ha2UgYW4gb2ZmZXIgdG8gdGhlIGNvbnN1bWVyLiBgV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHN1Y2ggYXMgd2hlbiBhbiBpbmRpdmlkdWFsIGFncmVlcyB0byBhY3QgYXMgYSBndWFyYW50b3Igb3IgYXNzdW1lcyBwZXJzb25hbCBsaWFiaWxpdHkgZm9yIGEgY29uc3VtZXIsIGJ1c2luZXNzLCBvciBjb21tZXJjaWFsIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSB7XG4gICAgQWNjb3VudFJldmlld0NyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19DUkVESVQnLFxuICAgIEFjY291bnRSZXZpZXdOb25DcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVCcsXG4gICAgRW1wbG95bWVudCA9ICdFTVBMT1lNRU5UJyxcbiAgICBFeHRlbnNpb25PZkNyZWRpdCA9ICdFWFRFTlNJT05fT0ZfQ1JFRElUJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkVGVuYW50U2NyZWVuaW5nID0gJ0xFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkT3RoZXIgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX09USEVSJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25QcmVxdWFsaWZpY2F0aW9uID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTicsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUidcbn1cblxuLyoqXG4gKiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSBkZWZpbmVzIHRoZSB1c2VyIGlkZW50aXR5IGRhdGEgY29sbGVjdGVkIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBiZSBzZXQgaWYgeW91IGxhdGVyIHVzZSB0aGUgY3JlYXRlZCB1c2VyIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVycy4gVGhlIGZvcm1hdCBvZiBwaG9uZSBudW1iZXIgd2lsbCBiZSB2YWxpZGF0ZWQgYW5kIGZvciBiZXR0ZXIgbm9ybWFsaXphdGlvbiwgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gRS4xNjQgZm9ybWF0ICt7Y291bnRyeWNvZGV9e251bWJlcn0sIGZvciBleGFtcGxlIGArMTQxNTEyMzQ1NjdgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnlfY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zaWdodHMgYXJvdW5kIGEgdXNlclxcJ3MgY291bnRlcnBhcnRpZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgcmVsYXRlZCB0byBhIHVzZXLigJlzIHRyYW5zYWN0aW9ucyB3aXRoIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBkZXRlY3RlZCBhY2NvdW50IHR5cGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAgICAgKi9cbiAgICBmaW5hbmNpYWxfaW5zdGl0dXRpb25faW5zaWdodHM/OiBBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBJbnNpZ2h0cyBhYm91dCBhIHVzZXLigJlzIHRvcCBtZXJjaGFudHMsIHJhbmtlZCBieSBzcGVuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfaW5zaWdodHM/OiBBcnJheTxNZXJjaGFudEluc2lnaHRzPjtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSB0eXBlLiAgYG1lcmNoYW50YDogYSBwcm92aWRlciBvZiBnb29kcyBvciBzZXJ2aWNlcyBmb3IgcHVyY2hhc2UgYGZpbmFuY2lhbF9pbnN0aXR1dGlvbmA6IGEgZmluYW5jaWFsIGVudGl0eSAoYmFuaywgY3JlZGl0IHVuaW9uLCBCTlBMLCBmaW50ZWNoKSBgcGF5bWVudF9hcHBgOiBhIHRyYW5zZmVyIG9yIFAyUCBhcHAgKGUuZy4gWmVsbGUpIGBtYXJrZXRwbGFjZWA6IGEgbWFya2V0cGxhY2UgKGUuZyBEb29yRGFzaCwgR29vZ2xlIFBsYXkgU3RvcmUpIGBwYXltZW50X3Rlcm1pbmFsYDogYSBwb2ludC1vZi1zYWxlIHBheW1lbnQgdGVybWluYWwgKGUuZyBTcXVhcmUsIFRvYXN0KSBgaW5jb21lX3NvdXJjZWA6IHRoZSBwYXllciBpbiBhbiBpbmNvbWUgdHJhbnNhY3Rpb24gKGUuZy4sIGFuIGVtcGxveWVyLCBjbGllbnQsIG9yIGdvdmVybm1lbnQgYWdlbmN5KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRlcnBhcnR5VHlwZSB7XG4gICAgTWVyY2hhbnQgPSAnbWVyY2hhbnQnLFxuICAgIEZpbmFuY2lhbEluc3RpdHV0aW9uID0gJ2ZpbmFuY2lhbF9pbnN0aXR1dGlvbicsXG4gICAgUGF5bWVudEFwcCA9ICdwYXltZW50X2FwcCcsXG4gICAgTWFya2V0cGxhY2UgPSAnbWFya2V0cGxhY2UnLFxuICAgIFBheW1lbnRUZXJtaW5hbCA9ICdwYXltZW50X3Rlcm1pbmFsJyxcbiAgICBJbmNvbWVTb3VyY2UgPSAnaW5jb21lX3NvdXJjZSdcbn1cblxuLyoqXG4gKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRyeUNvZGUge1xuICAgIFVzID0gJ1VTJyxcbiAgICBHYiA9ICdHQicsXG4gICAgRXMgPSAnRVMnLFxuICAgIE5sID0gJ05MJyxcbiAgICBGciA9ICdGUicsXG4gICAgSWUgPSAnSUUnLFxuICAgIENhID0gJ0NBJyxcbiAgICBEZSA9ICdERScsXG4gICAgSXQgPSAnSVQnLFxuICAgIFBsID0gJ1BMJyxcbiAgICBEayA9ICdESycsXG4gICAgTm8gPSAnTk8nLFxuICAgIFNlID0gJ1NFJyxcbiAgICBFZSA9ICdFRScsXG4gICAgTHQgPSAnTFQnLFxuICAgIEx2ID0gJ0xWJyxcbiAgICBQdCA9ICdQVCcsXG4gICAgQmUgPSAnQkUnXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgSW5jb21lIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgSXRlbXMgaW4gdGhlIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyYUJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zdW1tYXJ5PzogQ3JhQmFua0luY29tZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEluY29tZSByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyYS9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogQXJyYXk8Q3JhQmFua0luY29tZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVuZCB1c2VyXFwncyBtb250aGx5IHN1bW1hcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyYUJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyYUJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgYmFuayBpbmNvbWUgYWNyb3NzIGFsbCBpbmNvbWUgc291cmNlcyBhbmQgaXRlbXMgKG1heCBoaXN0b3J5IG9mIDczMCBkYXlzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGVzdGltYXRlIG9mIHRoZSBhdmVyYWdlIGdyb3NzIG1vbnRobHkgaW5jb21lIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIG5ldCBhbW91bnQgYW5kIGluY29tZSBjYXRlZ29yeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIGRhdGEgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlPzogQ3JhQmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBJREVOVElUWV9VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IGlkZW50aXR5IGZvciB0aGUgSXRlbSBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgdHJhbnNhY3Rpb25zIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIFJlcG9ydERlbGV0ZWQgPSAnUkVQT1JUX0RFTEVURUQnLFxuICAgIERhdGFVbmF2YWlsYWJsZSA9ICdEQVRBX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTkge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIEZBQ1RBIGlzIGEgZmlsaW5nIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmYWN0YV9maWxpbmdfcmVxdWlyZW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgMm5kIFRJTiBleGlzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHNlY29uZF90aW5fZXhpc3RzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3kge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuczsgY2FuIGluY2x1ZGUgYXQgbW9zdCBvbmUgVk9BL3N0YW5kYXJkIEFzc2V0IFJlcG9ydCB0b2tlbnMgYW5kIG9uZSBWT0UgQXNzZXQgUmVwb3J0IFRva2VuLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciwgd2hpY2ggYWxsb3dzIHRoZW0gdG8gZmV0Y2ggdGhlIEFzc2V0IFJlcG9ydHMgYXR0YWNoZWQgdG8gdGhlIHRva2VuLiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBdWRpdCBDb3B5IFRva2VuIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGJhbmsgZW1wbG95bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJhbmsgZW1wbG95bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0QmFua0VtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBkZXBvc2l0IGZyb20gdGhpcyBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGxhdGVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIgZnJvbSB3aXRoaW4gdGhlIHBlcmlvZCBvZiB0aGUgZGF5cyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlYXJsaWVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQmFuayBFbXBsb3ltZW50IGRhdGEuIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgYSBkaXN0aW5jdCBiYW5rIGVtcGxveW1lbnQgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVwb3J0czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIGRpZmZlcmVudCBlbXBsb3llciBmb3VuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudD47XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW1cXCdzIGFjY291bnRzIHRoYXQgaGF2ZSBCYW5rIEVtcGxveW1lbnQgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfYWNjb3VudHM6IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pjtcbn1cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBFbXBsb3ltZW50IGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQgd2FzIGdlbmVyYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgRW1wbG95bWVudCByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz47XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ3JlZGl0QmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0VNUExPWU1FTlRfV0FSTklOR2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlIHtcbiAgICBCYW5rRW1wbG95bWVudFdhcm5pbmcgPSAnQkFOS19FTVBMT1lNRU5UX1dBUk5JTkcnXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgSW5jb21lIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgSXRlbXMgaW4gdGhlIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zdW1tYXJ5PzogQ3JlZGl0QmFua0luY29tZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEluY29tZSByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogRGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIElkZW50aXR5IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBzbyBmaWVsZCBtYXkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IHR5cGUuIFRoaXMgd2lsbCBhbHdheXMgYmUgYGRlcG9zaXRvcnlgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlIHtcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknXG59XG5cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeS4gTm90ZSB0aGF0IHRoZSBgQ0FTSGAgdmFsdWUgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgdXNlZCBvbmx5IGZvciBleGlzdGluZyBsZWdhY3kgaW1wbGVtZW50YXRpb25zLiBJdCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbmV3IGNhdGVnb3JpZXMgYENBU0hfREVQT1NJVGAgKHJlcHJlc2VudGluZyBjYXNoIG9yIGNoZWNrIGRlcG9zaXRzKSBhbmQgYFRSQU5TRkVSX0ZST01fQVBQTElDQVRJT05gIChyZXByZXNlbnRpbmcgY2FzaCB0cmFuc2ZlcnMgb3JpZ2luYXRpbmcgZnJvbSBhcHBzLCBzdWNoIGFzIFplbGxlIG9yIFZlbm1vKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluY29tZSBwYXkgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgZGF5cyBvZiBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHJlZnJlc2guIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB0aGUgbW9zdCByZWNlbnRseSBnZW5lcmF0ZWQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFN1bW1hcnkgZm9yIGJhbmsgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkgcmV0dXJuIGFuIGluY29ycmVjdCB2YWx1ZSBpZiB0aGUgc3VtbWFyeSBpbmNsdWRlcyBpbmNvbWUgc291cmNlcyBpbiBtdWx0aXBsZSBjdXJyZW5jaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbnMgZGF0YSBmb3IgdGhlIGVuZCB1c2VyXFwncyBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3kgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBjcmVkaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50LCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRtZW50IChDTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYEdJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYFBMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYE5PTkVgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCBmb3IgdGhlIGRhdGEuICBgVU5LTk9XTmA6IERvY3VtZW50IHR5cGUgY291bGQgbm90IGJlIGRldGVybWluZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIFVSTCB0byByZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBmaWxlLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBmaWxlIHR5cGUgd2lsbCBhbHdheXMgYmUgUERGLCBhbmQgdGhlIGZpbGUgbWF5IG5vdCBiZSBhdmFpbGFibGUsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgLiBJZiB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBnZW5lcmF0ZSBhIFBERiBpZiB0aGUgb3JpZ2luYWwgaXMgbm90IGF2YWlsYWJsZSwgY29udGFjdCB5b3VyIEFjY291bnQgTWFuYWdlci4gRm9yIERvY3VtZW50IEluY29tZSwgdGhpcyBmaWVsZCB3aWxsIG5vdCBiZSBgbnVsbGAsIGFuZCB0aGUgZmlsZSB0eXBlIHdpbGwgYmUgdGhlIG9yaWdpbmFsIGZpbGUgdHlwZSB1cGxvYWRlZCBieSB0aGUgdXNlci4gRm9yIG1vcmUgZGV0YWlscyBvbiBhdmFpbGFibGUgZmlsZSB0eXBlcywgc2VlIHRoZSBbRG9jdW1lbnQgSW5jb21lXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9pbmNvbWUvcGF5cm9sbC1pbmNvbWUpIGRvY3VtZW50YXRpb24uICBUaGlzIGRvd25sb2FkIFVSTCBjYW4gb25seSBiZSB1c2VkIG9uY2UgYW5kIGV4cGlyZXMgYWZ0ZXIgdHdvIG1pbnV0ZXMuIFRvIGdlbmVyYXRlIGEgbmV3IGRvd25sb2FkIFVSTCwgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGFnYWluLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb3dubG9hZF91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYWdlcyBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQgKGlmIGF2YWlsYWJsZSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHBhZ2VfY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGVtcGxveW1lbnQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95bWVudCBpdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVG9rZW4gdG8gcmVwcmVzZW50IHRoZSB1bmRlcmx5aW5nIEVtcGxveW1lbnQgZGF0YVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBlbXBsb3ltZW50IGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGl0bGUgb2YgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkczogQ3JlZGl0UGxhdGZvcm1JZHM7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1wbG95bWVudCBmb3IgdGhlIGluZGl2aWR1YWwuIGBcXFwiRlVMTF9USU1FXFxcImA6IEEgZnVsbC10aW1lIGVtcGxveWVlLiBgXFxcIlBBUlRfVElNRVxcXCJgOiBBIHBhcnQtdGltZSBlbXBsb3llZS4gYFxcXCJDT05UUkFDVE9SXFxcImA6IEFuIGVtcGxveWVlIHR5cGljYWxseSBoaXJlZCBleHRlcm5hbGx5IHRocm91Z2ggYSBjb250cmFjdGluZyBncm91cC4gYFxcXCJURU1QT1JBUllcXFwiYDogQSB0ZW1wb3JhcnkgZW1wbG95ZWUuIGBcXFwiT1RIRVJcXFwiYDogVGhlIGVtcGxveWVlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5lZCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZWVfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZW1wbG95ZWVcXCdzIG1vc3QgcmVjZW50IHBheXN0dWIgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9wYXlzdHViX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0RFVEFJTDogQXNzZXREZXRhaWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0T3duZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfSE9MREVSOiBBc3NldEhvbGRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmFsaWRhdGlvblNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIFZBTElEQVRJT05fU09VUkNFUzogVmFsaWRhdGlvblNvdXJjZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcuLi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVUQUlMOiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVNDUklQVElPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXQ+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBMYXN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaWRkbGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBNaWRkbGVOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9ydGdhZ2UgbG9hbiBhZ3JlZW1lbnQgYmV0d2VlbiBvbmUgb3IgbW9yZSBib3Jyb3dlcnMgYW5kIGEgbW9ydGdhZ2UgbGVuZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgbG9hbi4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJTdWJqZWN0TG9hblxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hblxuICAgICAqL1xuICAgIExvYW5Sb2xlVHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbklkZW50aWZpZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBBcnJheTxMb2FuSWRlbnRpZmllcj47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2Fuc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBDcmVkaXRGcmVkZGllTWFjTG9hbjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcGFydGllcyB0byBhIGRlYWwuIFRoaXMgaW5jbHVkZXMgdGhlIGRpcmVjdCBwYXJ0aWNpcGF0aW5nIHBhcnRpZXMsIHN1Y2ggYXMgYm9ycm93ZXIgYW5kIHNlbGxlciBhbmQgdGhlIGluZGlyZWN0IHBhcnRpZXMgc3VjaCBhcyB0aGUgY3JlZGl0IHJlcG9ydCBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydGllcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0RGF0ZVRpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLiBUaGUgdmFsdWUgY2FuIG9ubHkgYmUgXFxcIlJlcG9ydElEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydElkZW50aWZpZXJUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvblBhcmVudElkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZnJlZGRpZV9tYWMvcmVwb3J0cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIERFQUw6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMgKFZPQSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIFNjaGVtYVZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGRldGFpbHMgcmVsYXRlZCB0byBhIGZ1bGZpbGxtZW50IHNlcnZpY2Ugb3IgcHJvZHVjdCBpbiB0ZXJtcyBvZiByZXF1ZXN0LCBwcm9jZXNzIGFuZCByZXN1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gICAgICovXG4gICAgVkVSSUZJQ0FUSU9OX09GX0FTU0VUOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFNUQVRVU0VTOiBTdGF0dXNlcztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICAgICAqL1xuICAgIFNFUlZJQ0U6IENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgUkVQT1JUSU5HX0lORk9STUFUSU9OOiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVF9SRVNQT05TRTogQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBBU1NFVFM6IENyZWRpdEZyZWRkaWVNYWNBc3NldHM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIExPQU5TOiBDcmVkaXRGcmVkZGllTWFjTG9hbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgUEFSVElFUzogQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFNFUlZJQ0VTOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJEZWR1Y3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZGVkdWN0aW9uczogQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBDcmVkaXRQYXlTdHViRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRQYXlTdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBuZXRfcGF5OiBDcmVkaXRQYXlTdHViTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViUGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5U3R1YlBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViRGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXkgc3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbDogUGF5U3R1YkVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlIC0gZWl0aGVyIGBTSU5HTEVgIG9yIGBNQVJSSUVEYCBvciBgTk9UIExJU1RFRGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZDogUGF5U3R1YlRheHBheWVySUQ7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbXBsb3llciBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJOZXRQYXkge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIG5ldCBwYXkgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZXhwbGljaXQgcGF5IGJhc2lzIG9uIHRoZSBwYXlzdHViIChpZiBwcmVzZW50KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGUge1xuICAgIFNhbGFyeSA9ICdTQUxBUlknLFxuICAgIEhvdXJseSA9ICdIT1VSTFknLFxuICAgIENvbW1pc3Npb24gPSAnQ09NTUlTU0lPTidcbn1cblxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIGJvZHkgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5cm9sbCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciB0aGUgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbiBzZXNzaW9uXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz47XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9kb2N1bWVudHMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHRvIGJlIHJlZnJlc2hlZC4gRWFjaCBgaXRlbV9pZGAgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGF5cm9sbCBpbmNvbWUgaXRlbS4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQsIGFsbCBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIHdpbGwgYmUgcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgd2hlcmUgUGxhaWQgd2lsbCBzZW5kIHRoZSBwYXlyb2xsIGluY29tZSByZWZyZXNoIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcmlmaWNhdGlvbiByZWZyZXNoIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlVTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJTVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJOT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3JlZnJlc2hfc3RhdHVzOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBsYXRmb3JtSWRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbiBzdHJpbmdzLCB3aXRoIGF0IG1vc3Qgb25lIHRva2VuIG9mIGVhY2ggcmVwb3J0IHR5cGUuIEN1cnJlbnRseSBvbmx5IEFzc2V0IFJlcG9ydCB0b2tlbiBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90b2tlbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWNvbmRhcnlfY2xpZW50X2lkYCBpcyB0aGUgY2xpZW50IGlkIG9mIHRoZSB0aGlyZCBwYXJ0eSB3aXRoIHdob20geW91IHdvdWxkIGxpa2UgdG8gc2hhcmUgdGhlIHJlbGF5IHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY29uZGFyeV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIHdlYmhvb2tzIHdoZW4gdGhlIFNlY29uZGFyeSBDbGllbnQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlcyBhbiBBc3NldCBSZXBvcnQgYnkgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IHRvIGFsbG93IHRoZW0gdG8gYWNjZXNzIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIHJlbGF5IHRva2VuIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFuZCByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgZW1wbG95bWVudC4gIGBOT19FTVBMT1lNRU5UU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgSW5jb21lIExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBpbmNvbWUgIGBOT19ERVBPU0lUU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgVVNFUl9SRVBPUlRFRF9OT19JTkNPTUVgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZG9uXFwndCByZWNlaXZlIGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgU1RBUlRFRGA6IFRoZSB1c2VyIGJlZ2FuIHRoZSBiYW5rIGluY29tZSBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9EZXBvc2l0c0ZvdW5kID0gJ05PX0RFUE9TSVRTX0ZPVU5EJyxcbiAgICBVc2VyUmVwb3J0ZWROb0luY29tZSA9ICdVU0VSX1JFUE9SVEVEX05PX0lOQ09NRSdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBMaW5rIGVycm9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGFuIEl0ZW0gYWRkIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXlzdHVicyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW5zdGl0dXRpb24gTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2V0IG9mIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25SZXN1bHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIEl0ZW0gYWRkcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGl0ZW1fYWRkX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgZG9jdW1lbnRfaW5jb21lX3Jlc3VsdHM/OiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgZm9yIHRoZSB1c2VyLiBTZXNzaW9ucyB3aWxsIGJlIHNvcnRlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2Vzc2lvbnM/OiBBcnJheTxDcmVkaXRTZXNzaW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVzIgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBpbmNvbWUgZGF0YSB0YWtlbiBmcm9tIGEgVzIgdGF4IGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRXMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFcyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0UGF5U3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGF4X3llYXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZWUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHdhZ2VzX3RpcHNfb3RoZXJfY29tcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV93YWdlczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgc2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGJveF85OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZGVwZW5kZW50X2NhcmVfYmVuZWZpdHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfMTI6IEFycmF5PFcyQm94MTI+O1xuICAgIC8qKlxuICAgICAqIFN0YXR1dG9yeSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcmQgcGFydHkgc2ljayBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPdGhlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzOiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz47XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbnMgYSByaXNrIHNjb3JlIGFuZCBhIHJpc2sgdGllciB0aGF0IGV2YWx1YXRlIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBvZiBhbiB1bmF1dGhvcml6ZWQgZGViaXQuIENvbW1vbiByZXR1cm4gY29kZXMgaW4gdGhpcyBjYXRlZ29yeSBpbmNsdWRlOiBcXFwiUjA1XFxcIiwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIHRoZSBjdXN0b21lciBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdGllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0ZWQgbGlrZWxpaG9vZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiwgaWYgaW5pdGlhdGVkLCB3aWxsIGJlIHN1YmplY3QgdG8gYSByZXR1cm4uICBJbiB0aGUgYGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZml2ZSByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDAlIC0gMC4wMiUgICAyOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDIlIC0gMC4wNSUgICAzOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDUlIC0gMC4xJSAgIDQ6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4xJSAtIDAuNSUgICA1OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gMC41JSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlciB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Rhc2hib2FyZFVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGRhc2hib2FyZCB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBkYXNoYm9hcmQgdXNlcnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGFzaGJvYXJkVXNlcj59XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcnM6IEFycmF5PERhc2hib2FyZFVzZXI+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERhc2hib2FyZFVzZXJTdGF0dXMge1xuICAgIEludml0ZWQgPSAnaW52aXRlZCcsXG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgRGVhY3RpdmF0ZWQgPSAnZGVhY3RpdmF0ZWQnXG59XG5cbi8qKlxuICogQSBkYXRlIHJhbmdlIHdpdGggYSBzdGFydCBhbmQgZW5kIGRhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGF0ZVJhbmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgYmVnaW5uaW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhdGVSYW5nZVxuICAgICAqL1xuICAgIGVuZGluZzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PFRvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PERlZHVjdGlvbnNCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PFRvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IERlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG90YWwgZGVkdWN0aW9ucyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gdGhlIHdlYmhvb2sgcmVsYXRlcyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSB1c2VyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF91c2VyOiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtIHtcbiAgICBVcyA9ICdVUycsXG4gICAgQ2EgPSAnQ0EnXG59XG5cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RDb3VudHJ5Q29kZUVudW0ge1xuICAgIFVzID0gJ1VTJyxcbiAgICBDYSA9ICdDQSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbiBpdGVtcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSB1c2VyIHRvIHRoZWlyIFBheXJvbGwgUHJvdmlkZXIuIFRoZXNlIHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUgY2xpZW50IGlkIGFzIHRoZSBvbmUgY3JlYXRpbmcgdGhlIHN3aXRjaCwgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZSB0cmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faXRlbV9hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIkRFUE9TSVRfU1dJVENIXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBcXFwiU1dJVENIX1NUQVRFX1VQREFURVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlLCBvciBzdGF0dXMsIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gIGBpbml0aWFsaXplZGA6IFRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSB1c2VyIGVudGVyaW5nIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBzdWJtaXQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgcHJvY2Vzc2luZ2A6IFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgYGNvbXBsZXRlZGA6IFRoZSB1c2VyXFwncyBlbXBsb3llciBoYXMgZnVsZmlsbGVkIGFuZCBjb21wbGV0ZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgZXJyb3JgOiBUaGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtEZXBvc2l0IFN3aXRjaCBBUEkgcmVmZXJlbmNlXSgvZG9jcy9kZXBvc2l0LXN3aXRjaC9yZWZlcmVuY2UjZGVwb3NpdF9zd2l0Y2hnZXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSb3V0aW5nIG51bWJlciBmb3IgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnQsIGFzIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSBlbmQgdXNlciBpbiB0aGUgRGVwb3NpdCBTd2l0Y2ggaW50ZXJmYWNlLiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG5hbWUgdXNlZCBpbiBvbmxpbmUgYmFua2luZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW0ge1xuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBTYXZpbmdzID0gJ3NhdmluZ3MnXG59XG5cbi8qKlxuICogVGhlIGRlcG9zaXQgc3dpdGNoIHRhcmdldCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXhwYXllciBJRCBvZiB0aGUgdXNlciwgZ2VuZXJhbGx5IHRoZWlyIFNTTiwgRUlOLCBvciBUSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICB0YXhfcGF5ZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGVwb3NpdCBzd2l0Y2ggdG9rZW4sIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rIGZvciB0aGUgRGVwb3NpdCBTd2l0Y2ggcHJvZHVjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHBpcmF0aW9uIHRpbWUgb2YgdGhlIHRva2VuLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWRlcG9zaXRvcnkpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlIHtcbiAgICBDaGVja2luZyA9ICdjaGVja2luZycsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBIc2EgPSAnaHNhJyxcbiAgICBDZCA9ICdjZCcsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIENhc2hNYW5hZ2VtZW50ID0gJ2Nhc2ggbWFuYWdlbWVudCcsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0b3J5RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yIGFuZCB0aGVpciBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvciB7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYXRvcuKAmXMgY2xpZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpbGlnZW5jZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGV0YWlsZWRPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHBvc3NpYmxlIGFjY291bnQgZGV0ZWN0ZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgdHJhbnNhY3Rpb24gdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV0ZWN0ZWRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGV0ZWN0ZWRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIChkZXBvc2l0b3J5LCBjcmVkaXQsIGxvYW4sIGludmVzdG1lbnQgZXRjLikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBzdWJ0eXBlIG9mIHRoZSBhY2NvdW50LCBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb25zIHRvL2Zyb20gdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGRvY3VtZW50LiAgYERPQ1VNRU5UX1RZUEVfUEFZU1RVQmA6IEEgcGF5c3R1Yi4gIGBET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBET0NVTUVOVF9UWVBFX1VTX1RBWF9XMmA6IEEgVy0yIHdhZ2UgYW5kIHRheCBzdGF0ZW1lbnQgcHJvdmlkZWQgYnkgYSBVUyBlbXBsb3llciByZWZsZWN0aW5nIHdhZ2VzIGVhcm5lZCBieSB0aGUgZW1wbG95ZWUuICBgRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9FUkFTYDogQW4gZWxlY3Ryb25pYyBSZXRpcmVtZW50IEFjY291bnQgU3RhdGVtZW50IChlUkFTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9DTEVTYDogQSBDaXZpbGlhbiBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChDTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfR0lHYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmNvbWUgaXMgcmVsYXRlZCB0byBnaWcgd29yay4gRG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljIGRvY3VtZW50IHR5cGUuICBgRE9DVU1FTlRfVFlQRV9OT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYERPQ1VNRU5UX1RZUEVfUExBSURfR0VORVJBVEVEX1BBWVNUVUJfUERGYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBQREYgZm9yIHRoZSBwYXlzdHViIHdhcyBnZW5lcmF0ZWQgYnkgUGxhaWQuICBgVU5LTk9XTmA6IERvY3VtZW50IHR5cGUgY291bGQgbm90IGJlIGRldGVybWluZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2NUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIERvY3VtZW50VHlwZVBheXN0dWIgPSAnRE9DVU1FTlRfVFlQRV9QQVlTVFVCJyxcbiAgICBEb2N1bWVudFR5cGVCYW5rU3RhdGVtZW50ID0gJ0RPQ1VNRU5UX1RZUEVfQkFOS19TVEFURU1FTlQnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4VzIgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfVzInLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlFcmFzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBUycsXG4gICAgRG9jdW1lbnRUeXBlVXNNaWxpdGFyeUxlcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFUycsXG4gICAgRG9jdW1lbnRUeXBlVXNNaWxpdGFyeUNsZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9DTEVTJyxcbiAgICBEb2N1bWVudFR5cGVHaWcgPSAnRE9DVU1FTlRfVFlQRV9HSUcnLFxuICAgIERvY3VtZW50VHlwZU5vbmUgPSAnRE9DVU1FTlRfVFlQRV9OT05FJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheDEwOTlNaXNjID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYXzEwOTlfTUlTQycsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5SyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X0snLFxuICAgIERvY3VtZW50VHlwZVBsYWlkR2VuZXJhdGVkUGF5c3R1YlBkZiA9ICdET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERidcbn1cblxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQgd2FzIHByb2Nlc3NlZC4gSWYgYSBkb2N1bWVudCBmYWlscyB2ZXJpZmljYXRpb24sIHRoZSBkZXRhaWxzIGluIHRoZSBgYW5hbHlzaXNgIG9iamVjdCBzaG91bGQgaGVscCBjbGFyaWZ5IHdoeSB0aGUgZG9jdW1lbnQgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QXV0aGVudGljaXR5TWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgYXV0aGVudGljaXR5OiBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgaW1hZ2VfcXVhbGl0eTogSW1hZ2VRdWFsaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgZXh0cmFjdGVkX2RhdGE6IFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXMgfCBudWxsO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIHN1bW1hcnkgb2Ygd2hldGhlciB0aGUgZG9jdW1lbnQgaW4gdGhlIHByb3ZpZGVkIGltYWdlIG1hdGNoZXMgdGhlIGZvcm1hdHRpbmcgcnVsZXMgYW5kIHNlY3VyaXR5IGNoZWNrcyBmb3IgdGhlIGFzc29jaWF0ZWQganVyaXNkaWN0aW9uLiAgRm9yIGV4YW1wbGUsIG1vc3QgaWRlbnRpdHkgZG9jdW1lbnRzIGhhdmUgZm9ybWF0dGluZyBydWxlcyBsaWtlIHRoZSBmb2xsb3dpbmc6ICAgVGhlIGltYWdlIG9mIHRoZSBwZXJzb25cXCdzIGZhY2UgbXVzdCBoYXZlIGEgY2VydGFpbiBjb250cmFzdCBpbiBvcmRlciB0byBoaWdobGlnaHQgc2tpbiB0b25lICAgVGhlIHN1YmplY3QgaW4gdGhlIGRvY3VtZW50XFwncyBpbWFnZSBtdXN0IHJlbW92ZSBleWUgZ2xhc3NlcyBhbmQgcG9zZSBpbiBhIGNlcnRhaW4gd2F5ICAgVGhlIGluZm9ybWF0aW9uYWwgZmllbGRzIChuYW1lLCBkYXRlIG9mIGJpcnRoLCBJRCBudW1iZXIsIGV0Yy4pIG11c3QgYmUgY29sb3JlZCBhbmQgYWxpZ25lZCBhY2NvcmRpbmcgdG8gc3BlY2lmaWMgcnVsZXMgICBTZWN1cml0eSBmZWF0dXJlcyBsaWtlIHdhdGVybWFya3MgYW5kIGJhY2tncm91bmQgcGF0dGVybnMgbXVzdCBiZSBwcmVzZW50ICBTbyBhIGBtYXRjaGAgc3RhdHVzIGZvciB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2Ugc2VlbXMgdG8gY29uZm9ybSB0byB0aGUgdmFyaW91cyBmb3JtYXR0aW5nIGFuZCBzZWN1cml0eSBydWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldGVjdGVkIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgZGF0ZSBvZiBiaXJ0aCwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIGRhdGUgb2YgYmlydGggdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIHRoZSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnROYW1lTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCBhIGNlcnRhaW4gcmVhc29uIGFzIHRvIHdoeSBhIGRvY3VtZW50IGNvdWxkIHBvdGVudGlhbGx5IGJlIGZyYXVkdWxlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdCBmcm9tIHRoZSByaXNrIHNpZ25hbCBjaGVjay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCB3aGljaCB0aGUgcmlzayBzaWduYWwgd2FzIGNvbXB1dGVkIGZvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGZpZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyB1c2VkIHRvIHF1aWNrbHkgaWRlbnRpZnkgaWYgdGhlIHNpZ25hbCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGZpZWxkIGlzIGF1dGhlbnRpYyBvciBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGhhc19mcmF1ZF9yaXNrOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbWV0YWRhdGE6IERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgZmllbGQsIGFzIHNlZW4gb24gdGhlIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZXhwZWN0ZWRfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlcml2ZWQgdmFsdWUgb2J0YWluZWQgaW4gdGhlIHJpc2sgc2lnbmFsIGNhbGN1bGF0aW9uIHByb2Nlc3MgZm9yIHRoaXMgZmllbGRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBhY3R1YWxfdmFsdWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBwcm92aWRpbmcgbW9yZSBkZXRhaWwgaW50byB0aGUgcGFydGljdWxhciByaXNrIHNpZ25hbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgcGFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJpc2sgc2lnbmFsXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBhZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IHRoZSBpbnN0aXR1dGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIHZlcmlmaWNhdGlvbiBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmcmF1ZCByaXNrIGRhdGEgZm9yIGEgc2V0IG9mIGluY29tZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50IG1ldGFkYXRhIGFuZCBhc3NvY2lhdGVkIHJpc2sgc2lnbmFscyBwZXIgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIHNpbmdsZV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PFNpbmdsZURvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmlzayBzaWduYWxzIGNvbXB1dGVkIGZyb20gYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzIGFuZCB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudHNcXCcgbWV0YWRhdGFcbiAgICAgKiBAdHlwZSB7QXJyYXk8TXVsdGlEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgbXVsdGlfZG9jdW1lbnRfcmlza19zaWduYWxzOiBBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIEEgc3VtbWFyeSBhY3Jvc3MgYWxsIHJpc2sgc2lnbmFscyBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1N1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX3Njb3JlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvdXRjb21lIHN0YXR1cyBmb3IgdGhpcyBzcGVjaWZpYyBkb2N1bWVudCBzdWJtaXNzaW9uLiBEaXN0aW5jdCBmcm9tIHRoZSBvdmVyYWxsIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb24uc3RhdHVzYCB0aGF0IHN1bW1hcml6ZXMgdGhlIHZlcmlmaWNhdGlvbiBvdXRjb21lIGZyb20gb25lIG9yIG1vcmUgZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnRTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTWFudWFsbHlBcHByb3ZlZCA9ICdtYW51YWxseV9hcHByb3ZlZCdcbn1cblxuLyoqXG4gKiBEYXRhLCBpbWFnZXMsIGFuYWx5c2lzLCBhbmQgcmVzdWx0cyBmcm9tIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMuZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBgc3RlcHMuZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGRvY3VtZW50cyBzdWJtaXR0ZWQgdG8gdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlciBzdWJtaXNzaW9uLCB3aGVyZSBlYWNoIHN1Ym1pc3Npb24gd2lsbCBjb250YWluIGJvdGggYSBmcm9udCBhbmQgYmFjayBpbWFnZSwgb3IganVzdCBhIGZyb250IGltYWdlLCBkZXBlbmRpbmcgb24gdGhlIGRvY3VtZW50IHR5cGUuICBOb3RlOiBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgbGV0IGEgdXNlciBzdWJtaXQgYSBuZXcgc2V0IG9mIGRvY3VtZW50IGltYWdlcyB1cCB0byB0aHJlZSB0aW1lcyBpZiB3ZSBkZXRlY3QgdGhhdCBhIHByZXZpb3VzIGF0dGVtcHQgbWlnaHQgaGF2ZSBmYWlsZWQgZHVlIHRvIHVzZXIgZXJyb3IuIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3Qgc2V0IG9mIGRvY3VtZW50IGltYWdlcyBhcmUgYmx1cnJ5IG9yIG9ic2N1cmVkIGJ5IGdsYXJlLCB0aGUgdXNlciB3aWxsIGJlIGFza2VkIHRvIGNhcHR1cmUgdGhlaXIgZG9jdW1lbnRzIGFnYWluLCByZXN1bHRpbmcgaW4gYXQgbGVhc3QgdHdvIHNlcGFyYXRlIGVudHJpZXMgd2l0aGluIGBkb2N1bWVudHNgLiBJZiB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBpcyBgZmFpbGVkYCwgdGhlIHVzZXIgaGFzIGV4aGF1c3RlZCB0aGVpciByZXRyeSBhdHRlbXB0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZG9jdW1lbnRzOiBBcnJheTxEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50Pjtcbn1cbi8qKlxuICogSW1hZ2VzLCBleHRyYWN0ZWQgZGF0YSwgYW5kIGFuYWx5c2lzIGZyb20gYSB1c2VyXFwncyBpZGVudGl0eSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgc3RhdHVzOiBEb2N1bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF0dGVtcHRgIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgZG9jdW1lbnQgdXBsb2FkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRJbWFnZXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBpbWFnZXM6IFBoeXNpY2FsRG9jdW1lbnRJbWFnZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgZXh0cmFjdGVkX2RhdGE6IFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBEb2N1bWVudEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheXN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5ncyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEVhcm5pbmdzVG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8RWFybmluZ3NUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEVhcm5pbmdzVG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxzPzogQXJyYXk8RWFybmluZ3NUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEVhcm5pbmdzQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKi9cbiAgICBicmVha2Rvd24/OiBBcnJheTxFYXJuaW5nc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgdG90YWw/OiBFYXJuaW5nc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb259XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogRWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBob3VycyBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb3VybHkgcmF0ZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbiB7XG4gICAgQm9udXMgPSAnQk9OVVMnLFxuICAgIENvbW1pc3Npb24gPSAnQ09NTUlTU0lPTicsXG4gICAgT3ZlcnRpbWUgPSAnT1ZFUlRJTUUnLFxuICAgIFBhaWRUaW1lT2ZmID0gJ1BBSUQgVElNRSBPRkYnLFxuICAgIFJlZ3VsYXJQYXkgPSAnUkVHVUxBUiBQQVknLFxuICAgIFZhY2F0aW9uID0gJ1ZBQ0FUSU9OJyxcbiAgICBCYXNpY0FsbG93YW5jZUhvdXNpbmcgPSAnQkFTSUMgQUxMT1dBTkNFIEhPVVNJTkcnLFxuICAgIEJhc2ljQWxsb3dhbmNlU3Vic2lzdGVuY2UgPSAnQkFTSUMgQUxMT1dBTkNFIFNVQlNJU1RFTkNFJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbCB7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIHRoZSBlYXJuaW5ncyBmb3IgdGhpcyBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN1cml0eS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGVhcm5pbmdzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVtYWlsIGFkZHJlc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGVtYWlsIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgZW1haWwgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtYWlsIGFjY291bnQgYXMgZGVzY3JpYmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICB0eXBlOiBFbWFpbFR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEVtYWlsVHlwZUVudW0ge1xuICAgIFByaW1hcnkgPSAncHJpbWFyeScsXG4gICAgU2Vjb25kYXJ5ID0gJ3NlY29uZGFyeScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogU2NvcmUgZm91bmQgYnkgbWF0Y2hpbmcgZW1haWwgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBlbWFpbCBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIG5vcm1hbGl6ZWQgZW1haWwuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCAobWF0Y2hpbmcgdGhlIHNhbWUgZW1haWwgd2l0aCBkaWZmZXJlbnQgXFwnK1xcJyBleHRlbnNpb25zKSwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIGVtYWlsIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheXN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlIC0gZWl0aGVyIGBzaW5nbGVgIG9yIGBtYXJyaWVkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZD86IFRheHBheWVySUQ7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZSwgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IEFkZHJlc3NEYXRhTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGZyb20gMCB0byAxIGluZGljYXRpbmcgUGxhaWRcXCdzIGxldmVsIG9mIGNvbmZpZGVuY2UgaW4gdGhlIHBhaXJpbmcgYmV0d2VlbiB0aGUgZW1wbG95ZXIgYW5kIHRoZSBpbnN0aXR1dGlvbiAobm90IHlldCBpbXBsZW1lbnRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX3Njb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciwgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEVtcGxveWVyc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyIG5hbWUgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBwcm9kdWN0cyB0aGUgcmV0dXJuZWQgZW1wbG95ZXJzIHNob3VsZCBzdXBwb3J0LiBDdXJyZW50bHksIHRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gYFxcXCJkZXBvc2l0X3N3aXRjaFxcXCJgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveWVycyBtYXRjaGluZyB0aGUgc2VhcmNoIGNyaXRlcmlhLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3llcj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95ZXJzOiBBcnJheTxFbXBsb3llcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGVtcGxveW1lbnQgZGV0YWlscyBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnREZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhbm51YWxfc2FsYXJ5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIERhdGUgb24gd2hpY2ggdGhlIGVtcGxveWVlIHdhcyBoaXJlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgaGlyZV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGVzIG9mIHNvdXJjZSBlbXBsb3ltZW50IGRhdGEgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzaGFyZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW1wbG95bWVudFNvdXJjZVR5cGUge1xuICAgIEJhbmsgPSAnYmFuaycsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHByb29mIG9mIGVtcGxveW1lbnQgZGF0YSBmb3IgYW4gaW5kaXZpZHVhbFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBlbXBsb3ltZW50IGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZCBvZiBlbXBsb3ltZW50LCBpZiBhcHBsaWNhYmxlLiBQcm92aWRlZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZXJWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEVtcGxveWVyVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGl0bGUgb2YgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRpdGxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhdGZvcm1JZHN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwbGF0Zm9ybV9pZHM/OiBQbGF0Zm9ybUlkcztcbn1cbi8qKlxuICogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gc3VtbWFyaWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBFbXBsb3ltZW50U3RhdHVzQWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0FDVElWRScsXG4gICAgRW1wbG95bWVudFN0YXR1c0luYWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0lOQUNUSVZFJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5oYW5jZW1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbmhhbmNlbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlbWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDaGFubmVsfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PENvdW50ZXJwYXJ0eT47XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhY2NvdW50IGhvbGRlcjogIGBPVVRGTE9XYCAtIEluY2x1ZGVzIG91dGdvaW5nIHRyYW5zZmVycywgcHVyY2hhc2VzLCBhbmQgZmVlcy4gKFR5cGljYWxseSByZXByZXNlbnRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNoZWNraW5nIGFjY291bnRzIGFuZCBkZWJpdCBjYXJkcyBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjcmVkaXQgY2FyZHMuKSAgYElORkxPV2AgLSBJbmNsdWRlcyBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMsIGFuZCBpbmNvbWUuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgbmVnYXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLilcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uIHtcbiAgICBJbmZsb3cgPSAnSU5GTE9XJyxcbiAgICBPdXRmbG93ID0gJ09VVEZMT1cnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5yaWNobWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVucmljaG1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5yaWNobWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzOiBBcnJheTxDb3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGZvciB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiB0byBvYnRhaW4gdGhlIGJlc3QgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgbGVnYWN5IGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhY3lfY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5X2NvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmVuY2V9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcmVjdXJyZW5jZT86IFJlY3VycmVuY2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2ZmaWNpYWwgZG9jdW1lbnQsIHVzdWFsbHkgaXNzdWVkIGJ5IGEgZ292ZXJuaW5nIGJvZHkgb3IgaW5zdGl0dXRpb24sIHdpdGggYW4gYXNzb2NpYXRlZCBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlEb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eURvY3VtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIHR5cGU6IEVudGl0eURvY3VtZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaWtgIC0gUnVzc2lhbiBiYW5rIGNvZGUgIGBidXNpbmVzc19udW1iZXJgIC0gQSBudW1iZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBidXNpbmVzcyB3aXRoaW4gYSBjYXRlZ29yeSBvZiBidXNpbmVzc2VzICBgaW1vYCAtIE51bWJlciBhc3NpZ25lZCB0byB0aGUgZW50aXR5IGJ5IHRoZSBJbnRlcm5hdGlvbmFsIE1hcml0aW1lIE9yZ2FuaXphdGlvbiAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgc3dpZnRgIC0gTnVtYmVyIGlkZW50aWZ5aW5nIGEgYmFuayBhbmQgYnJhbmNoLiAgYHRheF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbGxlY3RpbmcgdGF4ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eURvY3VtZW50VHlwZSB7XG4gICAgQmlrID0gJ2JpaycsXG4gICAgQnVzaW5lc3NOdW1iZXIgPSAnYnVzaW5lc3NfbnVtYmVyJyxcbiAgICBJbW8gPSAnaW1vJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgU3dpZnQgPSAnc3dpZnQnLFxuICAgIFRheElkID0gJ3RheF9pZCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgZW50aXR5IGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50cz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc2VzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICB1cmxzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZW50aXR5IHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AgdGhhdCB3ZXJlIGNvbXBhcmVkIHdoZW4gdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gZW50aXR5IHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgLCB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IEFycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz47XG4gICAgLyoqXG4gICAgICogVVJMcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHVybHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXM+O1xufVxuLyoqXG4gKiBBbmFseXplZCBkb2N1bWVudHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5RG9jdW1lbnQ7XG59XG4vKipcbiAqIEVtYWlsIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlscyB7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNob3J0aGFuZCBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHNjcmVlbmluZyBsaXN0IGZvciBlbnRpdGllcy4gIGBBVV9DT05gOiBBdXN0cmFsaWEgRGVwYXJ0bWVudCBvZiBGb3JlaWduIEFmZmFpcnMgYW5kIFRyYWRlIENvbnNvbGlkYXRlZCBMaXN0ICBgQ0FfQ09OYDogR292ZXJubWVudCBvZiBDYW5hZGEgQ29uc29saWRhdGVkIExpc3Qgb2YgU2FuY3Rpb25zICBgRVVfQ09OYDogRXVyb3BlYW4gRXh0ZXJuYWwgQWN0aW9uIFNlcnZpY2UgQ29uc29saWRhdGVkIExpc3QgIGBJWl9TT0VgOiBTdGF0ZSBPd25lZCBFbnRlcnByaXNlIExpc3QgIGBJWl9VTkNgOiBVbml0ZWQgTmF0aW9ucyBDb25zb2xpZGF0ZWQgU2FuY3Rpb25zICBgSVpfV0JLYDogV29ybGQgQmFuayBMaXN0aW5nIG9mIEluZWxpZ2libGUgRmlybXMgYW5kIEluZGl2aWR1YWxzICBgVVNfQ0FQYDogVVMgT0ZBQyBDb3JyZXNwb25kZW50IEFjY291bnQgb3IgUGF5YWJsZS1UaHJvdWdoIEFjY291bnQgU2FuY3Rpb25zICBgVVNfRlNFYDogVVMgT0ZBQyBGb3JlaWduIFNhbmN0aW9ucyBFdmFkZXJzICBgVVNfTUJTYDogVVMgTm9uLVNETiBNZW51LUJhc2VkIFNhbmN0aW9ucyAgYFVTX1NETmA6IFVTIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgVVNfQ01DYDogVVMgT0ZBQyBOb24tU0ROIENoaW5lc2UgTWlsaXRhcnktSW5kdXN0cmlhbCBDb21wbGV4IExpc3QgIGBVU19VVkxgOiBCdXJlYXUgb2YgSW5kdXN0cnkgYW5kIFNlY3VyaXR5IFVudmVyaWZpZWQgTGlzdCAgYFVLX0hNQ2A6IFVLIEhNIFRyZWFzdXJ5IENvbnNvbGlkYXRlZCBMaXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlXYXRjaGxpc3RDb2RlIHtcbiAgICBDYUNvbiA9ICdDQV9DT04nLFxuICAgIEV1Q29uID0gJ0VVX0NPTicsXG4gICAgSXpTb2UgPSAnSVpfU09FJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVXNDYXAgPSAnVVNfQ0FQJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzTWJzID0gJ1VTX01CUycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFVzQ21jID0gJ1VTX0NNQycsXG4gICAgVXNVdmwgPSAnVVNfVVZMJyxcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIFVrSG1jID0gJ1VLX0hNQydcbn1cblxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGVudGl0aWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEVudGl0eVdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIGVudGl0eSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgT3JnYW5pemF0aW9uc1xcXCIgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEVudGl0eVdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IHVzZWQgZm9yIHNlYXJjaGluZyBhZ2FpbnN0IHdhdGNobGlzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBleHBpcmVkIHdoZW4gdGhlIHZlcmlmaWNhdGlvbiB3YXMgcGVyZm9ybWVkLiAgTm90ZTogSW4gdGhlIGNhc2Ugd2hlcmUgYW4gZXhwaXJhdGlvbiBkYXRlIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBkb2N1bWVudCBvciBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vX2RhdGFgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRXhwaXJhdGlvbkRhdGUge1xuICAgIE5vdEV4cGlyZWQgPSAnbm90X2V4cGlyZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gcmVxdWVzdCByZWZ1bmQgZGV0YWlscyBmcm9tIHRoZSBwYXllZVxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgU3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCB3aWxsIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLiAgSWYgcmVmdW5kIGRldGFpbHMgY291bGQgYmUgcmV0cmlldmVkLCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHJlcXVlc3RfcmVmdW5kX2RldGFpbHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHBheWVyXFwncyBhY2NvdW50LiBXaGVyZSBwb3NzaWJsZSwgdGhlIGVuZCB1c2VyIHdpbGwgYmUgYWJsZSB0byBzZXQgdXAgcGF5bWVudCBjb25zZW50IHVzaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQgaWYgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3N9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBwYXltZW50IG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gcmVxdWVzdCByZWZ1bmQgZGV0YWlscyBmcm9tIHRoZSBwYXllZVxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgU3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCB3aWxsIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLiAgSWYgcmVmdW5kIGRldGFpbHMgY291bGQgYmUgcmV0cmlldmVkLCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQgaWYgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgYmFjcz86IFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgZXh0ZXJuYWwgcGF5bWVudCByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGhvbGRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgYmFjczogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGludGVydmFsPzogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIG9ubHkgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIG9ubHkgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVHlwZXMgb2YgZG9jdW1lbnQgZm9ybWF0cy4gKFN1Z2dlc3RlZCB2YWx1ZXMpXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhDb250ZW50VHlwZXMge1xuICAgIEFwcGxpY2F0aW9uUGRmID0gJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgSW1hZ2VHaWYgPSAnaW1hZ2UvZ2lmJyxcbiAgICBJbWFnZUpwZWcgPSAnaW1hZ2UvanBlZycsXG4gICAgSW1hZ2VUaWZmID0gJ2ltYWdlL3RpZmYnLFxuICAgIEltYWdlUG5nID0gJ2ltYWdlL3BuZycsXG4gICAgQXBwbGljYXRpb25Kc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nXG59XG5cbi8qKlxuICogRmluYW5jaWFsIEluc3RpdHV0aW9uIHByb3ZpZGVyLXNwZWNpZmljIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEZpQXR0cmlidXRlIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbn1cbi8qKlxuICogUkVTVCBhcHBsaWNhdGlvbiBjb25zdHJhaW50IChIeXBlcm1lZGlhIEFzIFRoZSBFbmdpbmUgT2YgQXBwbGljYXRpb24gU3RhdGUpXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSGF0ZW9hc0xpbmsge1xuICAgIC8qKlxuICAgICAqIFVSTCB0byBpbnZva2UgdGhlIGFjdGlvbiBvbiB0aGUgcmVzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGhyZWY6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYSGF0ZW9hc0xpbmtBY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgYWN0aW9uPzogRkRYSGF0ZW9hc0xpbmtBY3Rpb247XG4gICAgLyoqXG4gICAgICogUmVsYXRpb24gb2YgdGhpcyBsaW5rIHRvIGl0cyBjb250YWluaW5nIGVudGl0eSwgYXMgZGVmaW5lZCBieSBhbmQgd2l0aCBtYW55IGV4YW1wbGUgcmVsYXRpb24gdmFsdWVzIGF0IFtJRVRGIFJGQzU5ODhdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTk4OClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIHJlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb250ZW50LXR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYQ29udGVudFR5cGVzPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICB0eXBlcz86IEFycmF5PEZEWENvbnRlbnRUeXBlcz47XG59XG4vKipcbiAqIEhUVFAgTWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWEhhdGVvYXNMaW5rQWN0aW9uIHtcbiAgICBHZXQgPSAnR0VUJyxcbiAgICBQb3N0ID0gJ1BPU1QnLFxuICAgIFBhdGNoID0gJ1BBVENIJyxcbiAgICBEZWxldGUgPSAnREVMRVRFJyxcbiAgICBQdXQgPSAnUFVUJ1xufVxuXG4vKipcbiAqIEluaXRpYXRvciBGaSBBdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU/OiBGRFhQYXJ0eVR5cGU7XG59XG4vKipcbiAqIFByb3ZpZGVzIHRoZSBiYXNlIGZpZWxkcyBvZiBhIG5vdGlmaWNhdGlvbi4gQ2xpZW50cyB3aWxsIHJlYWQgdGhlIGB0eXBlYCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSWQgb2Ygbm90aWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdHlwZTogRkRYTm90aWZpY2F0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBJU08gODYwMSBkYXRlLXRpbWUgaW4gZm9ybWF0IFxcJ1lZWVktTU0tRERUaGg6bW06c3Mubm5uW1p8Wyt8LV1oaDptbV1cXCcgYWNjb3JkaW5nIHRvIFtJRVRGIFJGQzMzMzldKGh0dHBzOi8veG1sMnJmYy50b29scy5pZXRmLm9yZy9wdWJsaWMvcmZjL2h0bWwvcmZjMzMzOS5odG1sI2FuY2hvcjE0KVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNlbnRPbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25DYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25TZXZlcml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc2V2ZXJpdHk/OiBGRFhOb3RpZmljYXRpb25TZXZlcml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUHJpb3JpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHByaW9yaXR5PzogRkRYTm90aWZpY2F0aW9uUHJpb3JpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaXNoZXI/OiBGRFhQYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHN1YnNjcmliZXI/OiBGRFhQYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZH1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgbm90aWZpY2F0aW9uUGF5bG9hZDogRkRYTm90aWZpY2F0aW9uUGF5bG9hZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYSGF0ZW9hc0xpbmt9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHVybD86IEZEWEhhdGVvYXNMaW5rO1xufVxuLyoqXG4gKiBDYXRlZ29yeSBvZiBOb3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5IHtcbiAgICBTZWN1cml0eSA9ICdTRUNVUklUWScsXG4gICAgTWFpbnRlbmFuY2UgPSAnTUFJTlRFTkFOQ0UnLFxuICAgIEZyYXVkID0gJ0ZSQVVEJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnLFxuICAgIE5ld0RhdGEgPSAnTkVXX0RBVEEnXG59XG5cbi8qKlxuICogQ3VzdG9tIGtleS12YWx1ZSBwYWlycyBwYXlsb2FkIGZvciBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uUGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogSUQgZm9yIHRoZSBvcmlnaW5hdGlvbiBlbnRpdHkgcmVsYXRlZCB0byB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gICAgICovXG4gICAgaWRUeXBlPzogRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RkRYRmlBdHRyaWJ1dGU+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gICAgICovXG4gICAgY3VzdG9tRmllbGRzPzogQXJyYXk8RkRYRmlBdHRyaWJ1dGU+O1xufVxuLyoqXG4gKiBUeXBlIG9mIGVudGl0eSBjYXVzaW5nIG9yaWdpbmF0aW9uIG9mIGEgbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlIHtcbiAgICBBY2NvdW50ID0gJ0FDQ09VTlQnLFxuICAgIEN1c3RvbWVyID0gJ0NVU1RPTUVSJyxcbiAgICBQYXJ0eSA9ICdQQVJUWScsXG4gICAgTWFpbnRlbmFuY2UgPSAnTUFJTlRFTkFOQ0UnLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBQcmlvcml0eSBvZiBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblByaW9yaXR5IHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIE1lZGl1bSA9ICdNRURJVU0nLFxuICAgIExvdyA9ICdMT1cnXG59XG5cbi8qKlxuICogU2V2ZXJpdHkgbGV2ZWwgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25TZXZlcml0eSB7XG4gICAgRW1lcmdlbmN5ID0gJ0VNRVJHRU5DWScsXG4gICAgQWxlcnQgPSAnQUxFUlQnLFxuICAgIFdhcm5pbmcgPSAnV0FSTklORycsXG4gICAgTm90aWNlID0gJ05PVElDRScsXG4gICAgSW5mbyA9ICdJTkZPJ1xufVxuXG4vKipcbiAqIFR5cGUgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25UeXBlIHtcbiAgICBDb25zZW50UmV2b2tlZCA9ICdDT05TRU5UX1JFVk9LRUQnLFxuICAgIENvbnNlbnRVcGRhdGVkID0gJ0NPTlNFTlRfVVBEQVRFRCcsXG4gICAgQ3VzdG9tID0gJ0NVU1RPTScsXG4gICAgU2VydmljZSA9ICdTRVJWSUNFJyxcbiAgICBCYWxhbmNlID0gJ0JBTEFOQ0UnLFxuICAgIFBsYW5uZWRPdXRhZ2UgPSAnUExBTk5FRF9PVVRBR0UnXG59XG5cbi8qKlxuICogRkRYIFBhcnRpY2lwYW50IC0gYW4gZW50aXR5IG9yIHBlcnNvbiB0aGF0IGlzIGEgcGFydCBvZiBhIEZEWCBBUEkgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogSHVtYW4gcmVjb2duaXphYmxlIGNvbW1vbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVVJJIGZvciBwYXJ0eSwgd2hlcmUgYW4gZW5kIHVzZXIgY291bGQgbGVhcm4gbW9yZSBhYm91dCB0aGUgY29tcGFueSBvciBhcHBsaWNhdGlvbiBpbnZvbHZlZCBpbiB0aGUgZGF0YSBzaGFyaW5nIGNoYWluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBob21lVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgYSBsb2dvIGFzc2V0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgZW5kIHVzZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIGxvZ29Vcmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5UmVnaXN0cnl9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0cnk/OiBGRFhQYXJ0eVJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgbmFtZSBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJlZCBpZCBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eUlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgY29udGFpbmluZyB0aGUgcGFydHnigJlzIHJlZ2lzdHJhdGlvbiB3aXRoIG5hbWUgYW5kIGlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVJlZ2lzdHJ5IHtcbiAgICBGZHggPSAnRkRYJyxcbiAgICBHbGVpZiA9ICdHTEVJRicsXG4gICAgSWNhbm4gPSAnSUNBTk4nLFxuICAgIFByaXZhdGUgPSAnUFJJVkFURSdcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGEgcGFydHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFBhcnR5VHlwZSB7XG4gICAgRGF0YUFjY2Vzc1BsYXRmb3JtID0gJ0RBVEFfQUNDRVNTX1BMQVRGT1JNJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgRGF0YVJlY2lwaWVudCA9ICdEQVRBX1JFQ0lQSUVOVCcsXG4gICAgSW5kaXZpZHVhbCA9ICdJTkRJVklEVUFMJyxcbiAgICBNZXJjaGFudCA9ICdNRVJDSEFOVCcsXG4gICAgVmVuZG9yID0gJ1ZFTkRPUidcbn1cblxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaXMgYXV0b21hdGljYWxseSB2ZXJpZmllZCB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaGFzIGFuIGV4cGlyZWQgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgbWljcm8tZGVwb3NpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX0VYUElSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaWNyby1kZXBvc2l0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5zaWdodHMgc3Vycm91bmRpbmcgZXh0ZXJuYWwgZmluYW5jaWFsIGluc3RpdHV0aW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIGlkIHRoYXQgbWFwcyB0byB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc29jaWF0ZWQgYWNjb3VudHMsIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBuYXR1cmUgb2YgdHJhbnNmZXJzIHRvL2Zyb20gdGhpcyBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RGV0ZWN0ZWRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGVjdGVkX2FjY291bnRzOiBBcnJheTxEZXRlY3RlZEFjY291bnQ+O1xufVxuLyoqXG4gKiBGb3JtIDEwOTkgVHlwZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRm9ybTEwOTlUeXBlIHtcbiAgICBVbmtub3duID0gJ0ZPUk1fMTA5OV9UWVBFX1VOS05PV04nLFxuICAgIE1pc2MgPSAnRk9STV8xMDk5X1RZUEVfTUlTQycsXG4gICAgSyA9ICdGT1JNXzEwOTlfVFlQRV9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIHRoZSBmcmF1ZCBvciBhdHRlbXB0ZWQgZnJhdWQuIGBmcmF1ZF9hbW91bnRgIHNob3VsZCBiZSBvbWl0dGVkIHRvIGluZGljYXRlIGFuIHVua25vd24gZnJhdWQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGcmF1ZEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyYXVkQW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SVNPQ3VycmVuY3lDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFtb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgMCB0byBpbmRpY2F0ZSBubyBtb25leSB3YXMgbG9zdC4gTXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gKGUuZy4sIGAxLjIzYCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBBbmFseXplZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBoZWFsdGggaW5jaWRlbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhJbmNpZGVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIGluY2lkZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpbmNpZGVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIG9uIHRoZSBoZWFsdGggaW5jaWRlbnQuXG4gICAgICogQHR5cGUge0FycmF5PEluY2lkZW50VXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBpbmNpZGVudF91cGRhdGVzOiBBcnJheTxJbmNpZGVudFVwZGF0ZT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGhvbGRpbmdzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuIFRoZSB3ZWJob29rIHR5cGljYWxseSBmaXJlcyBpbiByZXNwb25zZSB0byBhbnkgbmV3bHkgYWRkZWQgaG9sZGluZ3Mgb3IgcHJpY2UgY2hhbmdlcyB0byBleGlzdGluZyBob2xkaW5ncywgbW9zdCBjb21tb25seSBhZnRlciBtYXJrZXQgY2xvc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSE9MRElOR1NgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1cGRhdGVkIGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXBkYXRlZF9ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBob2xkaW5ncyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eTogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogSG93IFBsYWlkIHNob3VsZCBkZWxpdmVyIHRoZSBQbGFpZCBMaW5rIHNlc3Npb24gdG8gdGhlIGN1c3RvbWVyLiBcXCdzbXNcXCcgd2lsbCBkZWxpdmVyIHZpYSBTTVMuIE11c3QgcGFzcyBgdXNlci5waG9uZV9udW1iZXJgLiBcXCdlbWFpbFxcJyB3aWxsIGRlbGl2ZXIgdmlhIGVtYWlsLiBNdXN0IHBhc3MgYHVzZXIuZW1haWxfYWRkcmVzc2AuIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgaWdub3JlZDsgdXNlIHRoZSBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IGVudmlyb25tZW50IHRvIHRlc3QgSG9zdGVkIExpbmsgc2Vzc2lvbiBkZWxpdmVyeSBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ3NtcycsXG4gICAgRW1haWwgPSAnZW1haWwnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgaG9zdGVkIHNhbWUtZGF5IG1pY3JvZGVwb3NpdHMgdmVyaWZpY2F0aW9uIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhPU1RFRF9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIHNhbWUtZGF5IG1pY3JvZGVwb3NpdHMgdmVyaWZpY2F0aW9uLiBXaWxsIGFsd2F5cyBiZSBcXFwiTUFOVUFMTFlfVkVSSUZJRURcXFwiIG9yIFxcXCJWRVJJRklDQVRJT05fRkFJTEVEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgb2YgdGhlIGFmZmVjdGVkIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSBnbG9iYWxseSB1bmlxdWUgYW5kIGh1bWFuIHJlYWRhYmxlIElEIHR5cGUsIHNwZWNpZmljIHRvIHRoZSBjb3VudHJ5IGFuZCBkb2N1bWVudCBjYXRlZ29yeS4gRm9yIG1vcmUgY29udGV4dCBvbiB0aGlzIGZpZWxkLCBzZWUgW0h5YnJpZCBJbnB1dCBWYWxpZGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJRE51bWJlclR5cGUge1xuICAgIEFyRG5pID0gJ2FyX2RuaScsXG4gICAgQXVEcml2ZXJzTGljZW5zZSA9ICdhdV9kcml2ZXJzX2xpY2Vuc2UnLFxuICAgIEF1UGFzc3BvcnQgPSAnYXVfcGFzc3BvcnQnLFxuICAgIEJyQ3BmID0gJ2JyX2NwZicsXG4gICAgQ2FTaW4gPSAnY2Ffc2luJyxcbiAgICBDbFJ1biA9ICdjbF9ydW4nLFxuICAgIENuUmVzaWRlbnRDYXJkID0gJ2NuX3Jlc2lkZW50X2NhcmQnLFxuICAgIENvTml0ID0gJ2NvX25pdCcsXG4gICAgRGtDcHIgPSAnZGtfY3ByJyxcbiAgICBFZ05hdGlvbmFsSWQgPSAnZWdfbmF0aW9uYWxfaWQnLFxuICAgIEVzRG5pID0gJ2VzX2RuaScsXG4gICAgRXNOaWUgPSAnZXNfbmllJyxcbiAgICBIa0hraWQgPSAnaGtfaGtpZCcsXG4gICAgSW5QYW4gPSAnaW5fcGFuJyxcbiAgICBJdENmID0gJ2l0X2NmJyxcbiAgICBKb0NpdmlsSWQgPSAnam9fY2l2aWxfaWQnLFxuICAgIEpwTXlOdW1iZXIgPSAnanBfbXlfbnVtYmVyJyxcbiAgICBLZUh1ZHVtYU5hbWJhID0gJ2tlX2h1ZHVtYV9uYW1iYScsXG4gICAgS3dDaXZpbElkID0gJ2t3X2NpdmlsX2lkJyxcbiAgICBNeEN1cnAgPSAnbXhfY3VycCcsXG4gICAgTXhSZmMgPSAnbXhfcmZjJyxcbiAgICBNeU5yaWMgPSAnbXlfbnJpYycsXG4gICAgTmdOaW4gPSAnbmdfbmluJyxcbiAgICBOekRyaXZlcnNMaWNlbnNlID0gJ256X2RyaXZlcnNfbGljZW5zZScsXG4gICAgT21DaXZpbElkID0gJ29tX2NpdmlsX2lkJyxcbiAgICBQaFBzbiA9ICdwaF9wc24nLFxuICAgIFBsUGVzZWwgPSAncGxfcGVzZWwnLFxuICAgIFJvQ25wID0gJ3JvX2NucCcsXG4gICAgU2FOYXRpb25hbElkID0gJ3NhX25hdGlvbmFsX2lkJyxcbiAgICBTZVBpbiA9ICdzZV9waW4nLFxuICAgIFNnTnJpYyA9ICdzZ19ucmljJyxcbiAgICBUclRjS2ltbGlrID0gJ3RyX3RjX2tpbWxpaycsXG4gICAgVXNTc24gPSAndXNfc3NuJyxcbiAgICBVc1Nzbkxhc3Q0ID0gJ3VzX3Nzbl9sYXN0XzQnLFxuICAgIFphU21hcnRJZCA9ICd6YV9zbWFydF9pZCdcbn1cblxuLyoqXG4gKiBBbiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSVNPQ3VycmVuY3lDb2RlIHtcbiAgICBVc2QgPSAnVVNEJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBjaGFuZ2UgdG8gaWRlbnRpdHkgZGF0YSBoYXMgYmVlbiBkZXRlY3RlZCBvbiBhbiBJdGVtLiBJdGVtcyBhcmUgY2hlY2tlZCBmb3IgaWRlbnRpdHkgdXBkYXRlcyBldmVyeSAzMC05MCBkYXlzLiBXZSByZWNvbW1lbmQgdGhhdCB1cG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2sgeW91IG1ha2UgYW5vdGhlciBjYWxsIHRvIGAvaWRlbnRpdHkvZ2V0YCB0byBmZXRjaCB0aGUgdXNlclxcJ3MgbGF0ZXN0IGlkZW50aXR5IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGlkZW50aXR5IGF0dHJpYnV0ZXMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcIlBIT05FU1xcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PElkZW50aXR5VXBkYXRlVHlwZXM+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2lkZW50aXR5OiB7IFtrZXk6IHN0cmluZ106IEFycmF5PElkZW50aXR5VXBkYXRlVHlwZXM+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEb2N1bWVudCBvYmplY3Qgd2l0aCBtZXRhZGF0YSBvZiB0aGUgZG9jdW1lbnQgdXBsb2FkZWRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2hcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgbWF0Y2ggaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUsIHBob25lIG51bWJlciwgZW1haWwgYWRkcmVzcyBhbmQgYWRkcmVzcyB1c2VkIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2guIElmIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIGlzIGVuYWJsZWQgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgbWF0Y2ggYWdhaW5zdCBQSUkgY29sbGVjdGVkIGZyb20gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBjaGVja3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkcyB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aXR5UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcG9zc2libGUgdHlwZXMgb2YgaWRlbnRpdHkgZGF0YSB0aGF0IG1heSBoYXZlIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVVwZGF0ZVR5cGVzIHtcbiAgICBQaG9uZXMgPSAnUEhPTkVTJyxcbiAgICBBZGRyZXNzZXMgPSAnQUREUkVTU0VTJyxcbiAgICBFbWFpbHMgPSAnRU1BSUxTJyxcbiAgICBOYW1lcyA9ICdOQU1FUydcbn1cblxuLyoqXG4gKiBBIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gYXV0b2ZpbGxlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyBob3cgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gaGFuZGxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gd2hlbiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBpZGVtcG90ZW5jeSBpcyBlbmFibGVkLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBpZGVtcG90ZW5jeSBpcyBkaXNhYmxlZCwgUGxhaWQgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCBhIGA0MDAgQmFkIFJlcXVlc3RgIHN0YXR1cyBjb2RlIGlmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHN1cHBsaWVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2lkZW1wb3RlbnQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC4gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHNoYXJlYWJsZSBVUkwgZmVhdHVyZSwgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlc2UgZmllbGRzIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbnN0ZWFkOyBib3RoIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYW5kIGAvbGluay90b2tlbi9jcmVhdGVgIGFyZSB2YWxpZCB3YXlzIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGEgbm9uLWBudWxsYCB1c2VyIGRhdGEgb2JqZWN0IHZpYSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgLCBhbnkgdXNlciBkYXRhIGZpZWxkcyBlbnRlcmVkIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwcmVmaWxsaW5nIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeWluZyBgdXNlci5jbGllbnRfdXNlcl9pZGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHByb3ZpZGUgYGNsaWVudF91c2VyX2lkYCBhdCB0aGUgcm9vdCBsZXZlbCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBUaGUgYWRkcmVzcyBtdXN0IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgdG8gYmUgYSB2YWxpZCBhZGRyZXNzOiBgc3RyZWV0YCwgYGNpdHlgLCBgY291bnRyeWAuIElmIGFueSBhcmUgbWlzc2luZyBvciB1bmFibGUgdG8gYmUgZXh0cmFjdGVkLCB0aGUgYWRkcmVzcyB3aWxsIGJlIG51bGwuICBgcmVnaW9uYCwgYW5kIGBwb3N0YWxfY29kZWAgbWF5IGJlIG51bGwgYmFzZWQgb24gdGhlIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZSAgTm90ZTogT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKE9DUikgdGVjaG5vbG9neSBtYXkgc29tZXRpbWVzIGV4dHJhY3QgaW5jb3JyZWN0IGRhdGEgZnJvbSBhIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDaXR5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgUGxhaWQgc2Vzc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgc2Vzc2lvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6IEFycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFlvdSBjYW4gdXNlIHRoaXMgZmllbGQgdG8gcHJlLXBvcHVsYXRlIHRoZSB1c2VyXFwncyBsZWdhbCBuYW1lOyBpZiBpdCBpcyBwcm92aWRlZCBoZXJlLCB0aGV5IHdpbGwgbm90IGJlIHByb21wdGVkIHRvIGVudGVyIHRoZWlyIG5hbWUgaW4gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZnVsbCBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBoYXMgbm90IHN1Ym1pdHRlZCB0aGVpciBuYW1lLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiByZXRyaWVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVUUklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgcmV0cnlpbmcgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RyYXRlZ3l9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc3RyYXRlZ3k6IFN0cmF0ZWd5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGVwcz86IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0cnVjdGlvbnMgZm9yIHRoZSBgY3VzdG9tYCByZXRyeSBzdHJhdGVneSBzcGVjaWZ5aW5nIHdoaWNoIHN0ZXBzIHNob3VsZCBiZSByZXF1aXJlZCBvciBza2lwcGVkLiAgIE5vdGU6ICAgVGhpcyBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gdGhlIHJldHJ5IHN0cmF0ZWd5IGlzIGBjdXN0b21gIGFuZCBtdXN0IGJlIG9taXR0ZWQgb3RoZXJ3aXNlLiAgQ3VzdG9tIHJldHJpZXMgb3ZlcnJpZGUgc2V0dGluZ3MgaW4geW91ciBQbGFpZCBUZW1wbGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgUGxhaWQgVGVtcGxhdGUgaGFzIGB2ZXJpZnlfc21zYCBkaXNhYmxlZCwgYSBjdXN0b20gcmV0cnkgd2l0aCBgdmVyaWZ5X3Ntc2AgZW5hYmxlZCB3aWxsIHN0aWxsIHJlcXVpcmUgdGhlIHN0ZXAuICBUaGUgYHNlbGZpZV9jaGVja2Agc3RlcCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2FuZGJveCBzZXJ2ZXIuIFNhbmRib3ggcmVxdWVzdHMgd2lsbCBzaWxlbnRseSBkaXNhYmxlIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIHdoZW4gcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYGt5Y19jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIGt5Y19jaGVjazogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IGJvb2xlYW47XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiAgIGBhY3RpdmVgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlzIGluY29tcGxldGUuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgb25lIG9yIG1vcmUgc3RlcHMgaW4gdGhlIHNlc3Npb24gYW5kIHdhcyB0b2xkIHRvIGNvbnRhY3Qgc3VwcG9ydC4gIGBleHBpcmVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgYWN0aXZlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgd2l0aG91dCBiZWluZyBjb21wbGV0ZWQgYW5kIHdhcyBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBleHBpcmVkLiBOb3RlIHRoYXQgc2Vzc2lvbnMgY3VycmVudGx5IGRvIG5vdCBleHBpcmUuIEF1dG9tYXRpYyBleHBpcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlIGZ1dHVyZS4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkLCBlaXRoZXIgdmlhIHRoZSBkYXNoYm9hcmQgYnkgYSB1c2VyLCBvciB2aWEgQVBJLiBUaGUgdXNlciBtYXkgaGF2ZSBjb21wbGV0ZWQgcGFydCBvZiB0aGUgc2Vzc2lvbiwgYnV0IGhhcyBuZWl0aGVyIGZhaWxlZCBvciBwYXNzZWQuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzdGVwIGluIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBXYWl0aW5nRm9yUHJlcmVxdWlzaXRlID0gJ3dhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZScsXG4gICAgTm90QXBwbGljYWJsZSA9ICdub3RfYXBwbGljYWJsZScsXG4gICAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJyxcbiAgICBNYW51YWxseVJlamVjdGVkID0gJ21hbnVhbGx5X3JlamVjdGVkJ1xufVxuXG4vKipcbiAqIEVhY2ggc3RlcCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICBgYWN0aXZlYCAtIFRoaXMgc3RlcCBpcyB0aGUgdXNlclxcJ3MgY3VycmVudCBzdGVwLiBUaGV5IGFyZSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZyB0aGlzIHN0ZXAsIG9yIHRoZXkgcmVjZW50bHkgY2xvc2VkIHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBzdGVwLiBPbmx5IG9uZSBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBhY3RpdmVgIGF0IGFueSBnaXZlbiBwb2ludC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIHRoaXMgc3RlcC4gVGhpcyBjYW4gZWl0aGVyIGNhbGwgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc3RlcCBkZXBlbmRpbmcgb24gaG93IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUgaXMgY29uZmlndXJlZC4gQSBmYWlsZWQgc3RlcCBkb2VzIG5vdCBpbXBseSBhIGZhaWxlZCBzZXNzaW9uLiAgYHdhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZWAgLSBUaGUgdXNlciBuZWVkcyB0byBjb21wbGV0ZSBhbm90aGVyIHN0ZXAgZmlyc3QsIGJlZm9yZSB0aGV5IHByb2dyZXNzIHRvIHRoaXMgc3RlcC4gVGhpcyBzdGVwIG1heSBuZXZlciBydW4sIGRlcGVuZGluZyBvbiBpZiB0aGUgdXNlciBmYWlscyBhbiBlYXJsaWVyIHN0ZXAgb3IgaWYgdGhlIHN0ZXAgaXMgb25seSBydW4gYXMgYSBmYWxsYmFjay4gIGBub3RfYXBwbGljYWJsZWAgLSBUaGlzIHN0ZXAgd2lsbCBub3QgYmUgcnVuIGZvciB0aGlzIHNlc3Npb24uICBgc2tpcHBlZGAgLSBUaGUgcmV0cnkgaW5zdHJ1Y3Rpb25zIHRoYXQgY3JlYXRlZCB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHNwZWNpZmllZCB0aGF0IHRoaXMgc3RlcCBzaG91bGQgYmUgc2tpcHBlZC4gIGBleHBpcmVkYCAtIFRoaXMgc3RlcCBoYWQgbm90IHlldCBiZWVuIGNvbXBsZXRlZCB3aGVuIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhcyBhIHdob2xlIGV4cGlyZWQuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIHVzZXIgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LiAgYG1hbnVhbGx5X2FwcHJvdmVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIHBhc3MgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLiAgYG1hbnVhbGx5X3JlamVjdGVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIGZhaWwgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGFjY2VwdF90b3M6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgY29tcGxldGVkIGEgc3RlcCBvZiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RFUF9VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgSUQgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmluZyB0aGUgYmVoYXZpb3Igb2YgYSBnaXZlbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGlkZW50aXR5IGRhdGEgdGhhdCB3YXMgZWl0aGVyIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyIG9yIHByb3ZpZGVkIHZpYSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgaGlnaCBsZXZlbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVhbGl0eSBvZiB0aGUgaW1hZ2UgdGhlIHVzZXIgc3VibWl0dGVkLiAgRm9yIGV4YW1wbGUsIGFuIGltYWdlIHRoYXQgaXMgYmx1cnJ5LCBkaXN0b3J0ZWQgYnkgZ2xhcmUgZnJvbSBhIG5lYXJieSBsaWdodCBzb3VyY2UsIG9yIGltcHJvcGVybHkgZnJhbWVkIG1pZ2h0IGJlIG1hcmtlZCBhcyBsb3cgb3IgbWVkaXVtIHF1YWxpdHkuIFBvb3IgcXVhbGl0eSBpbWFnZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGZhaWwgT0NSIGFuZC9vciB0ZW1wbGF0ZSBjb25mb3JtaXR5IGNoZWNrcy4gIE5vdGU6IEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgbGV0IGEgdXNlciByZWNhcHR1cmUgZG9jdW1lbnQgaW1hZ2VzIHR3aWNlIGJlZm9yZSBmYWlsaW5nIHRoZSBlbnRpcmUgc2Vzc2lvbiBpZiB3ZSBhdHRyaWJ1dGUgdGhlIGZhaWx1cmUgdG8gbG93IGltYWdlIHF1YWxpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbWFnZVF1YWxpdHkge1xuICAgIEhpZ2ggPSAnaGlnaCcsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgTG93ID0gJ2xvdydcbn1cblxuLyoqXG4gKiBBbiB1cGRhdGUgb24gdGhlIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVCcmVha2Rvd25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGUge1xuICAgIEJvbnVzID0gJ2JvbnVzJyxcbiAgICBPdmVydGltZSA9ICdvdmVydGltZScsXG4gICAgUmVndWxhciA9ICdyZWd1bGFyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwYXlzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5c3R1YnM/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGU+O1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpZWQgZmllbGRzIGZyb20gYSBwYXlzdHViIHZlcmlmaWNhdGlvbi4gQWxsIGZpZWxkcyBhcmUgcHJvdmlkZWQgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbXBsb3llcl9uYW1lOiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbXBsb3llZV9uYW1lOiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB5dGRfZ3Jvc3NfaW5jb21lOiBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX25ldF9pbmNvbWU6IFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgcHJvamVjdGVkX3dhZ2U6IFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZpZWRfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEZpZWxkIG51bWJlciBmb3IgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBpbmNvbWUgc3VtbWFyeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBlbmRwb2ludCB0byB3aGljaCBQbGFpZCBzaG91bGQgc2VuZCB3ZWJob29rcyByZWxhdGVkIHRvIHRoZSBwcm9ncmVzcyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcHJlY2hlY2sgY3JlYXRlZCB3aXRoIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuIFdpbGwgYmUgdXNlZCB0byBpbXByb3ZlIGNvbnZlcnNpb24gb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJlY2hlY2tfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGUgcHJvZHVjdCBkYXRhLiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gY29ycmVsYXRlIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSB0aGVzZSBJdGVtcyB3aXRoIGRhdGEgZnJvbSB0aGUgdXNlclxcJ3MgcGF5c3R1Yiwgc3VjaCBhcyBkYXRlIGFuZCBhbW91bnQuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBwcm9kdWN0IHdhcyBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZSBJdGVtcyBkdXJpbmcgTGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9wdGlvbnMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCBwYXJzaW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnIHtcbiAgICBPY3IgPSAnb2NyJyxcbiAgICBGcmF1ZFJpc2sgPSAnZnJhdWRfcmlzaydcbn1cblxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQgSUQgdG8gZG93bmxvYWQuIElmIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0aW5nIHppcCBmaWxlLCByYXRoZXIgdGhhbiBhbGwgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZsb3cgdHlwZXMgdG8gcmV0cmlldmUgcGF5cm9sbCBpbmNvbWUgZGF0YVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlIHtcbiAgICBEaWdpdGFsSW5jb21lID0gJ3BheXJvbGxfZGlnaXRhbF9pbmNvbWUnLFxuICAgIERvY3VtZW50SW5jb21lID0gJ3BheXJvbGxfZG9jdW1lbnRfaW5jb21lJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbiBmb3Igd2hpY2ggdG8gZ2V0IHBheXN0dWIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgZm9yIGFuIGluY29tZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YT86IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWJzOiBBcnJheTxQYXlzdHViPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb25maWRlbmNlIHRoYXQgUGxhaWQgY2FuIHN1cHBvcnQgdGhlIHVzZXIgaW4gdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93IGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgbWFudWFsIHBheXN0dWIgdXBsb2FkLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiSElHSFxcXCJgOiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gIFxcXCJgTE9XYFxcXCI6IEl0IGlzIHVubGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgYFxcXCJVTktOT1dOXFxcImA6IEl0IHdhcyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1c2VyIGlzIHN1cHBvcnRhYmxlIHdpdGggdGhlIGluZm9ybWF0aW9uIHBhc3NlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBMb3cgPSAnTE9XJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyB0YXggaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdGF4X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgZW1wbG95ZXJcXCdzIHB1YmxpYyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IG1pbGl0YXJ5IGluZm8gaW4gdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJlY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8ge1xuICAgIC8qKlxuICAgICAqIElzIHRoZSB1c2VyIGN1cnJlbnRseSBhY3RpdmUgZHV0eSBpbiB0aGUgVVMgbWlsaXRhcnlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBpc19hY3RpdmVfZHV0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZXJ2aW5nIGluIHRoZSBVUyBtaWxpdGFyeSwgdGhlIGJyYW5jaCBvZiB0aGUgbWlsaXRhcnkgaW4gd2hpY2ggdGhleSBhcmUgc2VydmluZyBWYWxpZCB2YWx1ZXM6IFxcJ0FJUiBGT1JDRVxcJywgXFwnQVJNWVxcJywgXFwnQ09BU1QgR1VBUkRcXCcsIFxcJ01BUklORVNcXCcsIFxcJ05BVllcXCcsIFxcJ1VOS05PV05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGJyYW5jaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlclxcJ3MgcGF5cm9sbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiBwYXlyb2xsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzX21pbGl0YXJ5X2luZm8/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHByZWNoZWNrLiBQcm92aWRlIHRoaXMgdmFsdWUgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIGluIG9yZGVyIHRvIG9wdGltaXplIExpbmsgY29udmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcHJlY2hlY2tfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBldmFsdWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgaG9tZV9hZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBhdHRlbXB0IHRvIHJlZnJlc2ggUGF5cm9sbCBJbmNvbWUgZGF0YSBmb3IgYSB1c2VyIHZpYSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCBmYWlsZWQgYmVjYXVzZSB0aGUgdXNlciBtdXN0IHJlLWNvbm5lY3QgdGhlaXIgcGF5cm9sbCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUkVGUkVTSF9SRUNPTk5FQ1RfTkVFREVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJpc2sgc2lnbmFscyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBkb2N1bWVudHMgdXBsb2FkZWQgdmlhIERvY3VtZW50IEluY29tZS4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBhIG1pbnV0ZSBvciB0d28gZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBtYXkgdGhlbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYW5kIHRvIHJldHJpZXZlIHJpc2sgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJJU0tfU0lHTkFMU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gZnJhdWQgZGV0ZWN0aW9uIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHVzZXIgdXBsb2FkZWQgbXVsdGlwbGUgZG9jdW1lbnRzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYWxsIGRvY3VtZW50cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIENhbGwgdGhlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGVuZHBvaW50IHRvIGdldCBhbGwgcmlzayBzaWduYWwgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHNfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzaGFyZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2UgaGFzIGNoYW5nZWQuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5QYXJlbnQgY29udGFpbmVyIGZvciBuYW1lIHRoYXQgYWxsb3dzIGZvciBjaG9pY2UgZ3JvdXAgYmV0d2VlbiBwYXJzZWQgYW5kIHVucGFyc2VkIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwsIGluY2x1ZGluZyBhbGwgcGFydHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIHBlcnNvbi4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGluZGl2aWR1YWxzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX0NJQWA6IENJQSBMaXN0IG9mIENoaWVmcyBvZiBTdGF0ZSBhbmQgQ2FiaW5ldCBNZW1iZXJzICBgSVpfSVBMYDogSW50ZXJwb2wgUmVkIE5vdGljZXMgZm9yIFdhbnRlZCBQZXJzb25zIExpc3QgIGBJWl9QRVBgOiBQb2xpdGljYWxseSBFeHBvc2VkIFBlcnNvbnMgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfUExDYDogVVMgT0ZBQyBQYWxlc3RpbmlhbiBMZWdpc2xhdGl2ZSBDb3VuY2lsICBgVVNfU0ROYDogVVMgT0ZBQyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFNHX1NPRmA6IEdvdmVybm1lbnQgb2YgU2luZ2Fwb3JlIFRlcnJvcmlzdHMgYW5kIFRlcnJvcmlzdCBFbnRpdGllcyAgYFRSX1RXTGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFRlcnJvcmlzdCBXYW50ZWQgTGlzdCAgYFRSX0RGRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IERvbWVzdGljIEZyZWV6aW5nIERlY2lzaW9ucyAgYFRSX0ZPUmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IEZvcmVpZ24gRnJlZXppbmcgUmVxdWVzdHMgIGBUUl9XTURgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBXZWFwb25zIG9mIE1hc3MgRGVzdHJ1Y3Rpb24gIGBUUl9DTUJgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBDYXBpdGFsIE1hcmtldHMgQm9hcmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlIHtcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJekNpYSA9ICdJWl9DSUEnLFxuICAgIEl6SXBsID0gJ0laX0lQTCcsXG4gICAgSXpQZXAgPSAnSVpfUEVQJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVWtIbWMgPSAnVUtfSE1DJyxcbiAgICBVc0RwbCA9ICdVU19EUEwnLFxuICAgIFVzRHRjID0gJ1VTX0RUQycsXG4gICAgVXNGYmkgPSAnVVNfRkJJJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzSXNuID0gJ1VTX0lTTicsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1BsYyA9ICdVU19QTEMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZsb3dNb2RlbCB7XG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lICBgbW9udGhseS1pbmNvbWVgOiBJbmNvbWUgb2NjdXJzIG9uY2UgcGVyIG1vbnRoIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGA6IFBheXMgb2ZmIHRoZSBiYWxhbmNlIG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIE5vdGUgdGhhdCBhY2NvdW50IHR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcyB3aWxsIGFjY3J1ZSBpbnRlcmVzdCBpbiB0aGUgU2FuZGJveC4gVGhlIHR5cGVzIGltcGFjdGVkIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBzdWJ0eXBlIGBjcmVkaXRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGluY29tZSBwZXIgbW9udGguIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBpbmNvbWVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24gd2lsbCBhcHBlYXIuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHBheW1lbnRfZGF5X29mX21vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgYmFsYW5jZSBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfZGF5X29mX21vbnRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gSWYgW0FjY291bnQgU2VsZWN0IHYyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvY3VzdG9taXphdGlvbi8jYWNjb3VudC1zZWxlY3QpIGlzIGVuYWJsZWQsIHRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIG1heSBoYXZlIG11bHRpcGxlIHJlY29yZHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgaW5zdGl0dXRpb24gSURzOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RpdHV0aW9uIGhhcyBtaWdyYXRlZCB0byBPQXV0aCwgdGhlcmUgbWF5IGJlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciB0aGUgT0F1dGggYW5kIG5vbi1PQXV0aCB2ZXJzaW9ucyBvZiB0aGUgaW5zdGl0dXRpb24uIEluc3RpdHV0aW9ucyB0aGF0IG9wZXJhdGUgaW4gZGlmZmVyZW50IGNvdW50cmllcyBvciB3aXRoIG11bHRpcGxlIGxvZ2luIHBvcnRhbHMgbWF5IGFsc28gaGF2ZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgZWFjaCBjb3VudHJ5IG9yIHBvcnRhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIFRvIGlkZW50aWZ5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgbWV0aG9kcywgdXNlIHRoZSBgYXV0aF9tZXRhZGF0YWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBpbnN0aXR1dGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpbWFyeSBjb2xvciB1c2VkIGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJpbWFyeV9jb2xvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmFzZTY0IGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBsb2dvLCByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLiBOb3QgYWxsIGluc3RpdHV0aW9uc1xcJyBsb2dvcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbG9nbz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIG5vdCBjb21wcmVoZW5zaXZlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhcyBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2lucz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aD86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiByZWNlbnQgaGVhbHRoIGluY2lkZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxIZWFsdGhJbmNpZGVudD59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaGVhbHRoX2luY2lkZW50cz86IEFycmF5PEhlYWx0aEluY2lkZW50PiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaW5zdGl0dXRpb24gc3RhdHVzIG1lZXRzIHRoZSBjb25kaXRpb25zIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmVsb3BlciBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBEQVNIQk9BUkRfQ09ORklHVVJFRF9BTEVSVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNUSVRVVElPTl9TVEFUVVNfQUxFUlRfVFJJR0dFUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZ2xvYmFsIHN1Y2Nlc3MgcmF0ZSBvZiB0aGUgaW5zdGl0dXRpb24sIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRlbSBhZGQgaGVhbHRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fb3ZlcmFsbF9zdWNjZXNzX3JhdGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBSVFAgbmV0d29yayBhbmQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFB9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAgICAgKi9cbiAgICBydHA6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRvIGdldCBkZXRhaWxzIGFib3V0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYC4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHNraXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuICBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBJbnN0aXR1dGlvbnMgYmFzZWQgb24gd2hpY2ggcHJvZHVjdHMgdGhleSBzdXBwb3J0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIHJvdXRpbmcgbnVtYmVycyB0byBmaWx0ZXIgaW5zdGl0dXRpb25zLiBUaGUgcmVzcG9uc2Ugd2lsbCBvbmx5IHJldHVybiBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCBhbGwgb2YgdGhlIHJvdXRpbmcgbnVtYmVycyBpbiB0aGUgYXJyYXkuIFJvdXRpbmcgbnVtYmVyIHJlY29yZHMgdXNlZCBmb3IgdGhpcyBtYXRjaGluZyBhcmUgbm90IGNvbXByZWhlbnNpdmU7IGZhaWx1cmUgdG8gbWF0Y2ggYSBnaXZlbiByb3V0aW5nIG51bWJlciB0byBhbiBpbnN0aXR1dGlvbiBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIGluc3RpdHV0aW9uIGlzIHVuc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVycz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEksIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgUGxhaWQgaW5zdGl0dXRpb25zXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGZpbHRlciB0byBhcHBseSB0byBpbnN0aXR1dGlvbnMgc2VhcmNoIHJlcXVlc3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgbG9hbj86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIGluc3RpdHV0aW9ucyBieSB2YXJpb3VzIFBheW1lbnQgSW5pdGlhdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluc3RpdHV0aW9ucyBtYXRjaGluZyB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1pbnZlc3RtZW50KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRBY2NvdW50U3VidHlwZSB7XG4gICAgXzUyOSA9ICc1MjknLFxuICAgIF80MDFhID0gJzQwMWEnLFxuICAgIF80MDFrID0gJzQwMWsnLFxuICAgIF80MDNCID0gJzQwM0InLFxuICAgIF80NTdiID0gJzQ1N2InLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIENhc2hJc2EgPSAnY2FzaCBpc2EnLFxuICAgIENyeXB0b0V4Y2hhbmdlID0gJ2NyeXB0byBleGNoYW5nZScsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE11dHVhbEZ1bmQgPSAnbXV0dWFsIGZ1bmQnLFxuICAgIE5vbkN1c3RvZGlhbFdhbGxldCA9ICdub24tY3VzdG9kaWFsIHdhbGxldCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckFubnVpdHkgPSAnb3RoZXIgYW5udWl0eScsXG4gICAgT3RoZXJJbnN1cmFuY2UgPSAnb3RoZXIgaW5zdXJhbmNlJyxcbiAgICBQZW5zaW9uID0gJ3BlbnNpb24nLFxuICAgIFByaWYgPSAncHJpZicsXG4gICAgUHJvZml0U2hhcmluZ1BsYW4gPSAncHJvZml0IHNoYXJpbmcgcGxhbicsXG4gICAgUXNociA9ICdxc2hyJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgU2VwSXJhID0gJ3NlcCBpcmEnLFxuICAgIFNpbXBsZUlyYSA9ICdzaW1wbGUgaXJhJyxcbiAgICBTaXBwID0gJ3NpcHAnLFxuICAgIFN0b2NrUGxhbiA9ICdzdG9jayBwbGFuJyxcbiAgICBUZnNhID0gJ3Rmc2EnLFxuICAgIFRydXN0ID0gJ3RydXN0JyxcbiAgICBVZ21hID0gJ3VnbWEnLFxuICAgIFV0bWEgPSAndXRtYScsXG4gICAgVmFyaWFibGVBbm51aXR5ID0gJ3ZhcmlhYmxlIGFubnVpdHknLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGVnYWN5IGZpZWxkIGZvcm1lcmx5IHVzZWQgaW50ZXJuYWxseSBieSBQbGFpZCB0byBpZGVudGlmeSBjZXJ0YWluIGNhbmNlbGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhbmNlbF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb27igJlzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZSB7XG4gICAgQWNjb3VudEZlZSA9ICdhY2NvdW50IGZlZScsXG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBc3NpZ25tZW50ID0gJ2Fzc2lnbm1lbnQnLFxuICAgIEJ1eSA9ICdidXknLFxuICAgIEJ1eVRvQ292ZXIgPSAnYnV5IHRvIGNvdmVyJyxcbiAgICBDb250cmlidXRpb24gPSAnY29udHJpYnV0aW9uJyxcbiAgICBEZXBvc2l0ID0gJ2RlcG9zaXQnLFxuICAgIERpc3RyaWJ1dGlvbiA9ICdkaXN0cmlidXRpb24nLFxuICAgIERpdmlkZW5kID0gJ2RpdmlkZW5kJyxcbiAgICBEaXZpZGVuZFJlaW52ZXN0bWVudCA9ICdkaXZpZGVuZCByZWludmVzdG1lbnQnLFxuICAgIEV4ZXJjaXNlID0gJ2V4ZXJjaXNlJyxcbiAgICBFeHBpcmUgPSAnZXhwaXJlJyxcbiAgICBGdW5kRmVlID0gJ2Z1bmQgZmVlJyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgSW50ZXJlc3RSZWNlaXZhYmxlID0gJ2ludGVyZXN0IHJlY2VpdmFibGUnLFxuICAgIEludGVyZXN0UmVpbnZlc3RtZW50ID0gJ2ludGVyZXN0IHJlaW52ZXN0bWVudCcsXG4gICAgTGVnYWxGZWUgPSAnbGVnYWwgZmVlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdsb2FuIHBheW1lbnQnLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW4gPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgTWFuYWdlbWVudEZlZSA9ICdtYW5hZ2VtZW50IGZlZScsXG4gICAgTWFyZ2luRXhwZW5zZSA9ICdtYXJnaW4gZXhwZW5zZScsXG4gICAgTWVyZ2VyID0gJ21lcmdlcicsXG4gICAgTWlzY2VsbGFuZW91c0ZlZSA9ICdtaXNjZWxsYW5lb3VzIGZlZScsXG4gICAgTm9uUXVhbGlmaWVkRGl2aWRlbmQgPSAnbm9uLXF1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgTm9uUmVzaWRlbnRUYXggPSAnbm9uLXJlc2lkZW50IHRheCcsXG4gICAgUGVuZGluZ0NyZWRpdCA9ICdwZW5kaW5nIGNyZWRpdCcsXG4gICAgUGVuZGluZ0RlYml0ID0gJ3BlbmRpbmcgZGViaXQnLFxuICAgIFF1YWxpZmllZERpdmlkZW5kID0gJ3F1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgUmViYWxhbmNlID0gJ3JlYmFsYW5jZScsXG4gICAgUmV0dXJuT2ZQcmluY2lwYWwgPSAncmV0dXJuIG9mIHByaW5jaXBhbCcsXG4gICAgUmVxdWVzdCA9ICdyZXF1ZXN0JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIFNlbGxTaG9ydCA9ICdzZWxsIHNob3J0JyxcbiAgICBTZW5kID0gJ3NlbmQnLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIFNwaW5PZmYgPSAnc3BpbiBvZmYnLFxuICAgIFNwbGl0ID0gJ3NwbGl0JyxcbiAgICBTdG9ja0Rpc3RyaWJ1dGlvbiA9ICdzdG9jayBkaXN0cmlidXRpb24nLFxuICAgIFRheCA9ICd0YXgnLFxuICAgIFRheFdpdGhoZWxkID0gJ3RheCB3aXRoaGVsZCcsXG4gICAgVHJhZGUgPSAndHJhZGUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBUcmFuc2ZlckZlZSA9ICd0cmFuc2ZlciBmZWUnLFxuICAgIFRydXN0RmVlID0gJ3RydXN0IGZlZScsXG4gICAgVW5xdWFsaWZpZWRHYWluID0gJ3VucXVhbGlmaWVkIGdhaW4nLFxuICAgIFdpdGhkcmF3YWwgPSAnd2l0aGRyYXdhbCdcbn1cblxuLyoqXG4gKiBWYWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYW5jZWxgOiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgd2hpY2ggbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyICBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIENhbmNlbCA9ICdjYW5jZWwnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgRmVlID0gJ2ZlZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInXG59XG5cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBQ0FUUz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2F0cz86IEFycmF5PE51bWJlcnNBQ0FUUz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBVE9OPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGF0b24/OiBBcnJheTxOdW1iZXJzQVRPTj47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lcnMgZm9yIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gb24gdGhlIG93bmVyc2hpcCBvZiBhbiBpbnZlc3RtZW50cyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgaWRlbnRpdHkgaW5mb3JtYXRpb24gcGVydGFpbnMgdG9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhPd25lclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJbiB0aGUgY2FzZSBvZiBhIGpvaW50IGFjY291bnQsIFBsYWlkIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHJlcG9ydCB0aGUgbmFtZXMgb2YgYWxsIGFjY291bnQgaG9sZGVycy4gIElmIGFuIEl0ZW0gY29udGFpbnMgbXVsdGlwbGUgYWNjb3VudHMgd2l0aCBkaWZmZXJlbnQgb3duZXIgbmFtZXMsIHNvbWUgaW5zdGl0dXRpb25zIHdpbGwgcmVwb3J0IGFsbCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaW4gZWFjaCBhY2NvdW50XFwncyBgbmFtZXNgIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhPd25lclxuICAgICAqL1xuICAgIG5hbWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjYW5jZWxlZF9pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgYWZ0ZXIgYW4gYXN5bmNocm9ub3VzIGV4dHJhY3Rpb24gb24gYW4gaW52ZXN0bWVudHMgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBISVNUT1JJQ0FMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGNhbmNlbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCB0cmFuc2FjdGlvbiBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCB0cmFuc2FjdGlvbiBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwIHdoZW4gZmV0Y2hpbmcgdHJhbnNhY3Rpb24gaGlzdG9yeVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnZlc3RtZW50cyBwcm9kdWN0IHZpYSB0aGUgYHByb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEEgYmluYXJ5IG1hdGNoIGluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGNvdW50cnkgdGhhdCBpc3N1ZWQgdGhlIHByb3ZpZGVkIGRvY3VtZW50IG1hdGNoZXMgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIFBsYWlkLiAgTm90ZTogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciBhIGBub19tYXRjaGAgb24gYGlzc3VpbmdfY291bnRyeWAgZmFpbHMgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGJ5IGVkaXRpbmcgeW91ciBQbGFpZCBUZW1wbGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElzc3VpbmdDb3VudHJ5IHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCdcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3MgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNjZXNzZWQuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IHdpbGwgYmUgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGJpbGxlZF9wcm9kdWN0c2AuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgSXRlbS4gSW4gYWxtb3N0IGFsbCBjYXNlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYmlsbGVkX3Byb2R1Y3RzYCBmaWVsZC4gRm9yIHNvbWUgcHJvZHVjdHMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhbiBJdGVtIGJ1dCBub3QgeWV0IGJpbGxlZCAoZS5nLiBBc3NldHMsIGJlZm9yZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGhhcyBiZWVuIGNhbGxlZCwgb3IgQXV0aCBvciBJZGVudGl0eSB3aGVuIGFkZGVkIGFzIE9wdGlvbmFsIFByb2R1Y3RzIGJ1dCBiZWZvcmUgdGhlaXIgZW5kcG9pbnRzIGhhdmUgYmVlbiBjYWxsZWQpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9kdWN0IG1heSBhcHBlYXIgaW4gYHByb2R1Y3RzYCBidXQgbm90IGluIGBiaWxsZWRfcHJvZHVjdHNgLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBnb25lIHRocm91Z2ggY29uc2VudCBjb2xsZWN0aW9uIGZvciB0aGUgSXRlbS4gT25seSBwcmVzZW50IGZvciB0aG9zZSBlbmFibGVkIGluIHRoZSBbRGF0YSBUcmFuc3BhcmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKSBiZXRhLiBJZiB5b3UgYXJlIG5vdCBlbnJvbGxlZCBpbiBEYXRhIFRyYW5zcGFyZW5jeSwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgUkZDIDMzMzkgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBjb25zZW50IHByb3ZpZGVkIGJ5IHRoZSBlbmQgdXNlciB3aWxsIGV4cGlyZS4gVXBvbiBjb25zZW50IGV4cGlyYXRpb24sIHRoZSBpdGVtIHdpbGwgZW50ZXIgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZS4gVG8gY2lyY3VtdmVudCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIGFuZCBtYWludGFpbiBjb250aW51b3VzIGNvbnNlbnQsIHRoZSBlbmQgdXNlciBjYW4gcmVhdXRoZW50aWNhdGUgdmlhIExpbmvigJlzIHVwZGF0ZSBtb2RlIGluIGFkdmFuY2Ugb2YgdGhlIGNvbnNlbnQgZXhwaXJhdGlvbiB0aW1lLiAgTm90ZSAtIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVfdHlwZTogSXRlbVVwZGF0ZVR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEl0ZW1VcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWN0aXZpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzOiBBcnJheTxBY3Rpdml0eT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRpbWVzdGFtcHMgZm9yIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhIHR5cGUgd2FzIGFjY2Vzc2VkIHBlciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGFzdERhdGFBY2Nlc3NUaW1lcz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3RfZGF0YV9hY2Nlc3NfdGltZXM6IEFycmF5PExhc3REYXRhQWNjZXNzVGltZXM+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbnM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogVXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBmb3IgY2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYGFjY2Vzc190b2tlbmAuIFRoaXMgaXMgb25seSBhbGxvd2VkIGZvciBzZWxlY3QgY2xpZW50cyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE1vc3QgY2xpZW50cyBzaG91bGQgY2FsbCAvaXRlbS9pbXBvcnQgdG8gb2J0YWluIGFuIGFjY2VzcyB0b2tlbiBiZWZvcmUgbWFraW5nIGEgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoIHtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IHVzZXJuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUgaGFzaGVkIGJ5IEZJLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIGZpX3VzZXJuYW1lX2hhc2g/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlczogU2NvcGVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGR1cmluZyBlbnJvbGxtZW50LCB0aGlzIGZpZWxkIG11c3QgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHN0YXRlIHNlbnQgdG8gdGhlIHBhcnRuZXIgaW4gdGhlIE9BdXRoIExvZ2luIFVSSS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGBFTlJPTExNRU5UYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc0NvbnRleHR9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb250ZXh0OiBTY29wZXNDb250ZXh0O1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmsvYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2l0aCBhbiBJdGVtLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2dldGAgYW5kIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJdGVtU3RhdHVzTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1JbXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcm9kdWN0IHN0cmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGh9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9hdXRoOiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGNvbmZpZ3VyZSBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIGFuIEl0ZW0uIFBsYWlkIGZpcmVzIGEgd2ViaG9vayBpZiBjcmVkZW50aWFscyBmYWlsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgb2YgdXNlciBJRCBhbmQgYXV0aCB0b2tlbiBwYWlyLCBwZXJtaXR0aW5nIFBsYWlkIHRvIGFnZ3JlZ2F0ZSBhIHVzZXLigJlzIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoIHtcbiAgICAvKipcbiAgICAgKiBPcGFxdWUgdXNlciBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBdXRob3JpemF0aW9uIHRva2VuIFBsYWlkIHdpbGwgdXNlIHRvIGFnZ3JlZ2F0ZSB0aGlzIHVzZXLigJlzIGFjY291bnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIGF1dGhfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGhhcyBleGl0ZWQgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSB3aXRob3V0IHRoZSB1c2VyIGhhdmluZyBnb25lIHRocm91Z2ggdGhlIHVwZGF0ZSBtb2RlIGZsb3cgaW4geW91ciBhcHAgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgdXNlciBjb21wbGV0ZWQgdGhlIHVwZGF0ZSBtb2RlIGluIGEgZGlmZmVyZW50IGFwcCkuIElmIHlvdSBoYXZlIG1lc3NhZ2luZyB0aGF0IHRlbGxzIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgbW9kZSBmbG93LCB5b3Ugc2hvdWxkIHNpbGVuY2UgdGhpcyBtZXNzYWdpbmcgdXBvbiByZWNlaXZpbmcgdGhlIGBMT0dJTl9SRVBBSVJFRGAgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTE9HSU5fUkVQQUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBvbmNlIFBsYWlkIGNhbGN1bGF0ZXMgaW5jb21lIGZyb20gYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGBwdWJsaWNfdG9rZW5gIGZvciB0aGUgcGFydGljdWxhciBJdGVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBgcHVibGljX3Rva2VuYCwgb2J0YWluZWQgZnJvbSB0aGUgTGluayBgb25TdWNjZXNzYCBjYWxsYmFjayBvciBgL3NhbmRib3gvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgdmFsdWUgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogSXRlbVN0YXR1c0ludmVzdG1lbnRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0ludmVzdG1lbnRzXG4gICAgICovXG4gICAgbGFzdF9mYWlsZWRfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgd2ViaG9vayBmaXJlZCBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHdoZW4gdGhlIHdlYmhvb2sgd2FzIGZpcmVkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAgICAgKi9cbiAgICBzZW50X2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB3ZWJob29rIGNvZGUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAgICAgKi9cbiAgICBjb2RlX3NlbnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIEl0ZW0uIFRvIHJlbW92ZSBhIHdlYmhvb2sgZnJvbSBhbiBJdGVtLCBzZXQgdG8gYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggW0pXVCBsaWJyYXJpZXNdKGh0dHBzOi8vand0LmlvLyNsaWJyYXJpZXMtaW8pIHRvIHZlcmlmeSBQbGFpZCB3ZWJob29rc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBKV0tQdWJsaWNLZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKV0tQdWJsaWNLZXkge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbGcgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBhbGc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3J2IG1lbWJlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGN1cnZlIHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNydjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBraWQgKEtleSBJRCkgbWVtYmVyIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgc3BlY2lmaWMga2V5LiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGNob29zZSBhbW9uZyBhIHNldCBvZiBrZXlzIHdpdGhpbiB0aGUgSldLIGR1cmluZyBrZXkgcm9sbG92ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGt0eSAoa2V5IHR5cGUpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBmYW1pbHkgdXNlZCB3aXRoIHRoZSBrZXksIHN1Y2ggYXMgUlNBIG9yIEVDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGt0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2UgKHB1YmxpYyBrZXkgdXNlKSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgaW50ZW5kZWQgdXNlIG9mIHRoZSBwdWJsaWMga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHVzZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB4IG1lbWJlciBjb250YWlucyB0aGUgeCBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgeSBtZW1iZXIgY29udGFpbnMgdGhlIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGVsbGlwdGljIGN1cnZlIHBvaW50LCBwcm92aWRlZCBhcyBhIGJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyBvZiB0aGUgY29vcmRpbmF0ZVxcJ3MgYmlnIGVuZGlhbiByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICB5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBrZXkgd2FzIGNyZWF0ZWQsIGluIFVuaXggdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBrZXkgZXhwaXJlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGV4cGlyZWRfYXQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgSldUIEhlYWRlciwgdXNlZCBmb3Igd2ViaG9vayB2YWxpZGF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXVEhlYWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXVEhlYWRlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldUSGVhZGVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UE9Cb3hTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBwb19ib3g6IFBPQm94U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzUHVycG9zZUxhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgZGF0ZV9vZl9iaXJ0aGAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGBreWNfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5reWNfY2hlY2tgIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBga3ljX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmt5Y19jaGVja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrQWRkcmVzc1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrTmFtZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IEtZQ0NoZWNrTmFtZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tJRE51bWJlclN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogS1lDQ2hlY2tJRE51bWJlclN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrUGhvbmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEtZQ0NoZWNrUGhvbmVTdW1tYXJ5O1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBpZF9udW1iZXJgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYG5hbWVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXN0RGF0YUFjY2Vzc1RpbWVzIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBhY2NvdW50X2JhbGFuY2VfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X2JhbGFuY2VfaW5mbzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfcm91dGluZ19udW1iZXIgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYWNjb3VudF9yb3V0aW5nX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGNvbnRhY3RfZGV0YWlscyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbnMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY3JlZGl0X2FuZF9sb2FucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfYW5kX2xvYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgaW52ZXN0bWVudHMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBwYXlyb2xsX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb25fcmlza19pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3Jpc2tfaW5mbzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElBQklMSVRJRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBsaWFiaWxpdGllcy5cXCdcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfbmV3X2xpYWJpbGl0aWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaWFiaWxpdGllcyBmaWVsZHMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcInBhc3RfYW1vdW50X2R1ZVxcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfbGlhYmlsaXRpZXM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxpYWJpbGl0eSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlZGl0IGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBjcmVkaXQ6IEFycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9ydGdhZ2UgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PE1vcnRnYWdlTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBtb3J0Z2FnZTogQXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3R1ZGVudCBsb2FuIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTdHVkZW50TG9hbj59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgc3R1ZGVudDogQXJyYXk8U3R1ZGVudExvYW4+IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBsaWFiaWxpdHkgb2JqZWN0LCBlaXRoZXIgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLiBNb3J0Z2FnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoZSBjdXN0b20gU2FuZGJveC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyY2hhc2UgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGlzIHRoZSBvbmx5IGludGVyZXN0IHJhdGUgdXNlZCB0byBjYWxjdWxhdGUgaW50ZXJlc3QgY2hhcmdlcy4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHB1cmNoYXNlX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXNoIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY2FzaF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFsYW5jZSB0cmFuc2ZlciBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGJhbGFuY2VfdHJhbnNmZXJfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpYWwgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzcGVjaWFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbGFzdF9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBtaW5pbXVtX3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YCBvciBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19vdmVyZHVlYCBmaWVsZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgbG9hbiBwcmluY2lwYWwuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5vbWluYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnRlcmVzdCBjYXBpdGFsaXphdGlvbiBiZWdpbnMgYXQgdGhlIGdpdmVuIG51bWJlciBvZiBtb250aHMgYWZ0ZXIgbG9hbiBvcmlnaW5hdGlvbi4gQnkgZGVmYXVsdCBpbnRlcmVzdCBpcyBuZXZlciBjYXBpdGFsaXplZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jYXBpdGFsaXphdGlvbl9ncmFjZV9wZXJpb2RfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuUmVwYXltZW50TW9kZWx9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X21vZGVsOiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZXhwZWN0ZWRfcGF5b2ZmX2RhdGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBndWFyYW50b3JgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfZmVkZXJhbGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX2ZlZGVyYWw6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsb2FuX25hbWVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBzbGZfc3RhdHVzOiBQU0xGU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4uZGVzY3JpcHRpb25gIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi50eXBlYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGBcXFwiZXh0ZW5kZWQgZ3JhZHVhdGVkXFxcImAsIGBcXFwiZXh0ZW5kZWQgc3RhbmRhcmRcXFwiYCwgYFxcXCJncmFkdWF0ZWRcXFwiYCwgYFxcXCJpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbmNvbWUtYmFzZWQgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJzdGFuZGFyZFxcXCJgLCBvciBgXFxcInNhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvblxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBjYWxsYmFja190eXBlPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0V2ZW50TmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBldmVudF9uYW1lPzogTGlua0V2ZW50TmFtZTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlcmUgaW4gdGhlIGZsb3cgdGhlIExpbmsgdXNlciBleGl0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGFjY291bnRzIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJZiBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBpcyBiZWluZyB1c2VkLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBiZWluZyB2ZXJpZmllZCBpcyBhIGBidXNpbmVzc2Agb3IgYHBlcnNvbmFsYCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rIGNvbnRhaW5pbmcgbWV0YWRhdGEgcHJveGllZCBvdmVyIGZyb20gTGluayBjYWxsYmFjayBlLmcgYG9uRXZlbnRgLCBgb25FeGl0YCwgYG9uU3VjY2Vzc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExJTktfQ0FMTEJBQ0tgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtDYWxsYmFja01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2NhbGxiYWNrX21ldGFkYXRhOiBMaW5rQ2FsbGJhY2tNZXRhZGF0YTtcbn1cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIGNvbnRhaW5pbmcgYm90aCB0aGUgdHlwZSBhbmQgYWRkcmVzcyB0byBzZW5kIHRoZSBVUkwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBtZXRob2Q/OiBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIC8gZW1haWwgYWRkcmVzcyB0aGF0IEhvc3RlZCBMaW5rIHNlc3Npb25zIGFyZSBkZWxpdmVyZWQgdG8uIFBob25lIG51bWJlcnMgbXVzdCBiZSBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNyZWF0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY29tcGxldGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBcXCdXZWxscyBGYXJnb1xcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHJlbGF0ZWQgdG8gdGhlIGRlbGl2ZXJ5IG9mIHRoZSBsaW5rIHNlc3Npb24gdG8gdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGNvbW11bmljYXRpb25fbWV0aG9kPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9zdGF0dXM/OiBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXM7XG59XG4vKipcbiAqIE9wdGlvbmFsIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBMaW5rRGVsaXZlcnlSZWNpcGllbnQ7XG59XG4vKipcbiAqIE1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIHJlY2lwaWVudC4gSWYgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBvcHVsYXRlIHRoaXMgZmllbGQgaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgaXQgYmxhbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIHNlbmQgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gVVJMIHRvLiBJZiBkZWxpdmVyeSBpcyBub3QgcmVxdWlyZWQsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZHM/OiBBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPjtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdpbGwgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwgLyB0ZXh0IChpZiBjb25maWd1cmVkKS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24uICBgQ1JFQVRFRGA6IFRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWNjZXNzZWQgYnkgdGhlIHVzZXIgIGBPUEVORURgOiBUaGUgc2Vzc2lvbiBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgYnV0IG5vdCB5ZXQgY29tcGxldGVkICBgRVhJVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gZXhpdGVkIGJ5IHRoZSB1c2VyICBgQ09NUExFVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSB1c2VyICBgRVhQSVJFRGA6IFRoZSBzZXNzaW9uIGhhcyBleHBpcmVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzIHtcbiAgICBDcmVhdGVkID0gJ0NSRUFURUQnLFxuICAgIE9wZW5lZCA9ICdPUEVORUQnLFxuICAgIEV4aXRlZCA9ICdFWElURUQnLFxuICAgIENvbXBsZXRlZCA9ICdDT01QTEVURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgTGluayBjYWxsYmFjayBldmVudFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZSB7XG4gICAgU3VjY2VzcyA9ICdPTl9TVUNDRVNTJyxcbiAgICBFdmVudCA9ICdPTl9FVkVOVCcsXG4gICAgRXhpdCA9ICdPTl9FWElUJ1xufVxuXG4vKipcbiAqIFRoZSBjb21tdW5pY2F0aW9uIG1ldGhvZCB1c2VkIHRvIGRlbGl2ZXIgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgdG8gdGhlIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdXNlciB3YXMgZ29pbmcgdGhyb3VnaCBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudCB7XG4gICAgLyoqXG4gICAgICogRXZlbnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWR1cGxpY2F0ZSBldmVudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBhbiBldmVudCB0aGF0IG9jY3VyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIGhhcyBlbmNvdW50ZXJlZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBNRkEgdHlwZXM6IGNvZGUsIGRldmljZSwgcXVlc3Rpb25zLCBzZWxlY3Rpb25zLiBFbWl0dGVkIGJ5OiBgU1VCTUlUX01GQWAgYW5kIGBUUkFOU0lUSU9OX1ZJRVdgIHdoZW4gdmlld19uYW1lIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQsIHdoaWNoIHdpbGwgYmUgZWl0aGVyIGByZXR1cm5pbmdfdXNlcmAgb3IgYHJvdXRpbmdfbnVtYmVyYC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1hdGNoX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgc3VibWl0dGVkIGJ5IHVzZXIgYXQgdGhlIG1pY3JvLWRlcG9zaXRzIHJvdXRpbmcgbnVtYmVyIHBhbmUuIEVtaXR0ZWQgYnkgYFNVQk1JVF9ST1VUSU5HX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgbWFzayBleHRyYWN0ZWQgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBhY2NvdW50IG51bWJlci4gSWYgdGhlIHVzZXItaW5wdXR0ZWQgYWNjb3VudCBudW1iZXIgaXMgZm91ciBkaWdpdHMgbG9uZywgYGFjY291bnRfbnVtYmVyX21hc2tgIGlzIGVtcHR5LiBFbWl0dGVkIGJ5IGBTVUJNSVRfQUNDT1VOVF9OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfbWFzaz86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGhhcyBqdXN0IG9jY3VycmVkIGluIHRoZSBMaW5rIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRXZlbnROYW1lIHtcbiAgICBCYW5rSW5jb21lSW5zaWdodHNDb21wbGV0ZWQgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfQ09NUExFVEVEJyxcbiAgICBDbG9zZU9hdXRoID0gJ0NMT1NFX09BVVRIJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgRXhpdCA9ICdFWElUJyxcbiAgICBGYWlsT2F1dGggPSAnRkFJTF9PQVVUSCcsXG4gICAgSGFuZG9mZiA9ICdIQU5ET0ZGJyxcbiAgICBPcGVuID0gJ09QRU4nLFxuICAgIE9wZW5NeVBsYWlkID0gJ09QRU5fTVlfUExBSUQnLFxuICAgIE9wZW5PYXV0aCA9ICdPUEVOX09BVVRIJyxcbiAgICBTZWFyY2hJbnN0aXR1dGlvbiA9ICdTRUFSQ0hfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEF1dGhUeXBlID0gJ1NFTEVDVF9BVVRIX1RZUEUnLFxuICAgIFNlbGVjdEJyYW5kID0gJ1NFTEVDVF9CUkFORCcsXG4gICAgU2VsZWN0RGVncmFkZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfREVHUkFERURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdERvd25JbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRE9XTl9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RmlsdGVyZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRklMVEVSRURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEluc3RpdHV0aW9uID0gJ1NFTEVDVF9JTlNUSVRVVElPTicsXG4gICAgU3VibWl0QWNjb3VudE51bWJlciA9ICdTVUJNSVRfQUNDT1VOVF9OVU1CRVInLFxuICAgIFN1Ym1pdENyZWRlbnRpYWxzID0gJ1NVQk1JVF9DUkVERU5USUFMUycsXG4gICAgU3VibWl0RG9jdW1lbnRzID0gJ1NVQk1JVF9ET0NVTUVOVFMnLFxuICAgIFN1Ym1pdERvY3VtZW50c0Vycm9yID0gJ1NVQk1JVF9ET0NVTUVOVFNfRVJST1InLFxuICAgIFN1Ym1pdERvY3VtZW50c1N1Y2Nlc3MgPSAnU1VCTUlUX0RPQ1VNRU5UU19TVUNDRVNTJyxcbiAgICBTdWJtaXRNZmEgPSAnU1VCTUlUX01GQScsXG4gICAgU3VibWl0Um91dGluZ051bWJlciA9ICdTVUJNSVRfUk9VVElOR19OVU1CRVInLFxuICAgIFRyYW5zaXRpb25WaWV3ID0gJ1RSQU5TSVRJT05fVklFVycsXG4gICAgVmlld0RhdGFUeXBlcyA9ICdWSUVXX0RBVEFfVFlQRVMnXG59XG5cbi8qKlxuICogQ29udGFpbnMgYSBzdW1tYXJ5IG9mIHRoZSBldmVudHMgZnJvbSBhIGxpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIGxpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgbGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIGxpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfY29ycmVsYXRpb25faWRgIGZyb20gYSByZWNlaXZlZCBPQXV0aCByZWRpcmVjdCBVUkkgY2FsbGJhY2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jb3JyZWxhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBsaW5rX3Rva2VuYCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBgbGlua19jb3JyZWxhdGlvbl9pZGAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlLWluaXRpYWxpemUgTGluay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIERpc3BsYXllZCBpZiBhIHVzZXIgZXhpdHMgTGluayB3aXRob3V0IHN1Y2Nlc3NmdWxseSBsaW5raW5nIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvaW50IGF0IHdoaWNoIHRoZSB1c2VyIGV4aXRlZCB0aGUgTGluayBmbG93LiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgSUQgZm9yIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSBieSBMaW5rLiBUaGlzIGNhbiBiZSBzaGFyZWQgd2l0aCBQbGFpZCBTdXBwb3J0IHRvIGV4cGVkaXRlIGludmVzdGlnYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBpbnN0aXR1dGlvbiBvYmplY3QuIElmIHRoZSBJdGVtIHdhcyBjcmVhdGVkIHZpYSBTYW1lLURheSBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiwgd2lsbCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBXZWxscyBGYXJnb2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgY29tcGxldGVkIExpbmsgc2Vzc2lvbiwgYWxvbmcgd2l0aCB0aGUgcHVibGljIHRva2VuIGlmIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU0VTU0lPTl9GSU5JU0hFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIExpbmsgc2Vzc2lvbi4gV2lsbCBhbHdheXMgYmUgXFxcIlNVQ0NFU1NcXFwiIG9yIFxcXCJFWElURURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvblN1Y2Nlc3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uc3VjY2VzcykgY2FsbGJhY2sgZnJvbSBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIERpc3BsYXllZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc1xuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIHRyYW5zZmVyX3N0YXR1cz86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXMgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKC9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgbnVsbGA6IG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgXFwnV2VsbHMgRmFyZ29cXCdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSB0cmFuc2Zlci4gUmV0dXJuZWQgb25seSB3aGVuIFtUcmFuc2ZlciBVSV0oL2RvY3MvdHJhbnNmZXIvdXNpbmctdHJhbnNmZXItdWkpIGlzIGltcGxlbWVudGVkLiAgLSBgQ09NUExFVEVgIOKAkyBUaGUgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4gLSBgSU5DT01QTEVURWAg4oCTIFRoZSB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBGb3IgaGVscCwgc2VlIFtUcm91Ymxlc2hvb3RpbmcgdHJhbnNmZXJzXSgvZG9jcy90cmFuc2Zlci91c2luZy10cmFuc2Zlci11aSN0cm91Ymxlc2hvb3RpbmctdHJhbnNmZXJzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXMge1xuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJyxcbiAgICBJbmNvbXBsZXRlID0gJ0lOQ09NUExFVEUnXG59XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIHByb3ZpZGUgbGltaXRlZCBhY2NvdW50IGZpbHRlcmluZzogaXQgd2lsbCBvbmx5IGRpc3BsYXkgSW5zdGl0dXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQsIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFjY291bnRzIG90aGVyIHRoYW4gYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIGFjY291bnRzIG9uIHRoZSBBY2NvdW50IFNlbGVjdCBwYW5lLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBUaGUgZmlsdGVyIG1heSBvciBtYXkgbm90IGltcGFjdCB0aGUgbGlzdCBvZiBhY2NvdW50cyBzaG93biBieSB0aGUgaW5zdGl0dXRpb24gaW4gdGhlIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3csIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgaW5zdGl0dXRpb24uIElmIHRoZSB1c2VyIHNlbGVjdHMgZXhjbHVkZWQgYWNjb3VudCBzdWJ0eXBlcyBpbiB0aGUgT0F1dGggZmxvdywgdGhlc2UgYWNjb3VudHMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIEl0ZW0uIElmIHRoZSB1c2VyIHNlbGVjdHMgb25seSBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzLCB0aGUgbGluayBhdHRlbXB0IHdpbGwgZmFpbCBhbmQgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byB0cnkgYWdhaW4uIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3RoZXJGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgb3RoZXI/OiBPdGhlckZpbHRlcjtcbn1cbi8qKlxuICogQSBtYXAgY29udGFpbmluZyBkYXRhIHRvIHBhc3MgaW4gZm9yIHRoZSBDYXJkIFN3aXRjaCBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaCB7XG4gICAgLyoqXG4gICAgICogVGhlIEJJTiAoQmFuayBJZGVudGlmaWNhdGlvbiBOdW1iZXIpIG9mIHRoZSBjYXJkIHRvIHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoXG4gICAgICovXG4gICAgY2FyZF9iaW46IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGNyZWRpdGAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEhvc3RlZCBMaW5rIChiZXRhKS4gT25seSBhdmFpbGFibGUgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgSG9zdGVkIExpbmsgYmV0YSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvc3RlZExpbmtEZWxpdmVyeU1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGRlbGl2ZXJ5X21ldGhvZD86IEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBVUkkgdGhhdCBIb3N0ZWQgTGluayB3aWxsIHJlZGlyZWN0IHRvIHVwb24gY29tcGxldGlvbiBvZiB0aGUgTGluayBmbG93LiBUaGlzIHdpbGwgb25seSBvY2N1ciBpbiBIb3N0ZWQgTGluayBzZXNzaW9ucywgbm90IGluIG90aGVyIGltcGxlbWVudGF0aW9uIG1ldGhvZHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3JlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBzZWNvbmRzIHRoZSBsaW5rIHdpbGwgYmUgdmFsaWQgZm9yLiBNdXN0IGJlIHBvc2l0aXZlLiBDYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMjEgZGF5cy4gVGhlIGRlZmF1bHQgbGlmZXRpbWUgaXMgNCBob3Vycy4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIHVybF9saWZldGltZV9zZWNvbmRzPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdXNlZCB0byBoaWdobGlnaHQgaW5zdGl0dXRpb25zIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBiYW5rIHRvIGhpZ2hsaWdodCBpbiBMaW5rLiBOb3RlOiBpbiByYXJlIGNhc2VzLCBhIHNpbmdsZSByb3V0aW5nIG51bWJlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIGluc3RpdHV0aW9ucywgZS5nLiBkdWUgdG8gYSBicm9rZXJhZ2UgdXNpbmcgYW5vdGhlciBpbnN0aXR1dGlvbiB0byBtYW5hZ2UgQUNIIG9uIGl0cyBzd2VlcCBhY2NvdW50cy4gSWYgdGhpcyBoYXBwZW5zLCB0aGUgYmFuayB3aWxsIG5vdCBiZSBoaWdobGlnaHRlZCBpbiBMaW5rIGV2ZW4gaWYgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBMaW5rLiBNYXhpbXVtIGxlbmd0aCBvZiAzMCBjaGFyYWN0ZXJzLiBJZiBhIHZhbHVlIGxvbmdlciB0aGFuIDMwIGNoYXJhY3RlcnMgaXMgcHJvdmlkZWQsIExpbmsgd2lsbCBkaXNwbGF5IFxcXCJUaGlzIEFwcGxpY2F0aW9uXFxcIiBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYW5ndWFnZSB0aGF0IExpbmsgc2hvdWxkIGJlIGRpc3BsYXllZCBpbi4gV2hlbiBpbml0aWFsaXppbmcgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24sIHRoaXMgZmllbGQgaXMgbm90IHVzZWQ7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHN1cHBvcnRlZCBsYW5ndWFnZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8jc3VwcG9ydGVkLWxhbmd1YWdlcykuICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogLSBEYW5pc2ggKGBcXCdkYVxcJ2ApIC0gRHV0Y2ggKGBcXCdubFxcJ2ApIC0gRW5nbGlzaCAoYFxcJ2VuXFwnYCkgLSBFc3RvbmlhbiAoYFxcJ2V0XFwnYCkgLSBGcmVuY2ggKGBcXCdmclxcJ2ApIC0gR2VybWFuIChgXFwnZGVcXCdgKSAtIEl0YWxpYW4gKGBcXCdpdFxcJ2ApIC0gTGF0dmlhbiAoYFxcJ2x2XFwnYCkgLSBMaXRodWFuaWFuIChgXFwnbHRcXCdgKSAtIE5vcndlZ2lhbiAoYFxcJ25vXFwnYCkgLSBQb2xpc2ggKGBcXCdwbFxcJ2ApIC0gUG9ydHVndWVzZSAoYFxcJ3B0XFwnYCkgLSBSb21hbmlhbiAoYFxcJ3JvXFwnYCkgLSBTcGFuaXNoIChgXFwnZXNcXCdgKSAtIFN3ZWRpc2ggKGBcXCdzdlxcJ2ApICBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJlZCBoZXJlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmcgaW4gdGhlIGN1c3RvbWl6YXRpb24sIG9yIHRoZSBjdXN0b21pemF0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiBQbGFpZC1zdXBwb3J0ZWQgY291bnRyeSBjb2RlcyB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW5zdGl0dXRpb25zIGZyb20gYWxsIGxpc3RlZCBjb3VudHJpZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgY29tcGxldGUgbWFwcGluZyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMgYnkgY291bnRyeSwgc2VlIGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbC8uICBJZiB1c2luZyBJZGVudGl0eSBWZXJpZmljYXRpb24sIGBjb3VudHJ5X2NvZGVzYCBzaG91bGQgYmUgc2V0IHRvIHRoZSBjb3VudHJ5IHdoZXJlIHlvdXIgY29tcGFueSBpcyBiYXNlZCwgbm90IHRoZSBjb3VudHJ5IHdoZXJlIHlvdXIgdXNlciBpcyBsb2NhdGVkLiBGb3IgYWxsIG90aGVyIHByb2R1Y3RzLCBgY291bnRyeV9jb2Rlc2AgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgeW91ciB1c2VyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBJZiBMaW5rIGlzIGxhdW5jaGVkIHdpdGggbXVsdGlwbGUgY291bnRyeSBjb2Rlcywgb25seSBwcm9kdWN0cyB0aGF0IHlvdSBhcmUgZW5hYmxlZCBmb3IgaW4gYWxsIGNvdW50cmllcyB3aWxsIGJlIHVzZWQgYnkgTGluay4gTm90ZSB0aGF0IHdoaWxlIGFsbCBjb3VudHJpZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiBTYW5kYm94IGFuZCBEZXZlbG9wbWVudCwgaW4gUHJvZHVjdGlvbiBvbmx5IFVTIGFuZCBDYW5hZGEgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gQWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucyByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbXBsaWFuY2Ugc3RlcHMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucyBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiBJZiB5b3UgaW5pdGlhbGl6ZSB3aXRoIGEgRXVyb3BlYW4gY291bnRyeSBjb2RlLCB5b3VyIHVzZXJzIHdpbGwgc2VlIHRoZSBFdXJvcGVhbiBjb25zZW50IHBhbmVsIGR1cmluZyB0aGUgTGluayBmbG93LiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBTYW1lLWRheSBNaWNyby1kZXBvc2l0cywgb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBgY291bnRyeV9jb2Rlc2AgbXVzdCBiZSBzZXQgdG8gYFtcXCdVU1xcJ11gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXI7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZS4gSWYgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHNob3VsZCBiZSBvbWl0dGVkICh1bmxlc3MgeW91IGFyZSB1c2luZyB1cGRhdGUgbW9kZSB0byBhZGQgSW5jb21lIG9yIEFzc2V0cyB0byBhbiBJdGVtKTsgcmVxdWlyZWQgb3RoZXJ3aXNlLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBUaGUgcHJvZHVjdHMgc3BlY2lmaWVkIGhlcmUgd2lsbCBkZXRlcm1pbmUgd2hpY2ggaW5zdGl0dXRpb25zIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHlvdXIgdXNlcnMgaW4gTGluay4gT25seSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0ICphbGwqIHJlcXVlc3RlZCBwcm9kdWN0cyBjYW4gYmUgc2VsZWN0ZWQ7IGEgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNlbGVjdCBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYSBsaXN0ZWQgcHJvZHVjdCwgYSBcXFwiQ29ubmVjdGl2aXR5IG5vdCBzdXBwb3J0ZWRcXFwiIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gTGluay4gVG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlLCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgbWluaW1hbCBwcm9kdWN0IHNldCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gQWRkaXRpb25hbCBwcm9kdWN0cyBjYW4gYmUgaW5jbHVkZWQgdmlhIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LW9wdGlvbmFsLXByb2R1Y3RzKSBvciAgW2ByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtcmVxdWlyZWQtaWYtc3VwcG9ydGVkLXByb2R1Y3RzKSBmaWVsZHMsIG9yIGNhbiBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIHRoZSBlbmRwb2ludCBhZnRlciBvYnRhaW5pbmcgYW4gYWNjZXNzIHRva2VuLiBGb3IgZGV0YWlscyBhbmQgZXhjZXB0aW9ucywgc2VlIFtDaG9vc2luZyB3aGVuIHRvIGluaXRpYWxpemUgcHJvZHVjdHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvKS4gIE5vdGUgdGhhdCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIHRvIGRpc2FibGUgSW5zdGFudCBNYXRjaCBzdXBwb3J0LCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IEluc3RhbnQgTWF0Y2ggd2lsbCBhbHNvIGJlIHNob3duIGluIExpbmsgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGV2ZW4gdGhvdWdoIHRoZXNlIGluc3RpdHV0aW9ucyBkbyBub3QgY29udGFpbiBgYXV0aGAgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS4gIEluIFByb2R1Y3Rpb24sIHlvdSB3aWxsIGJlIGJpbGxlZCBmb3IgZWFjaCBwcm9kdWN0IHRoYXQgeW91IHNwZWNpZnkgd2hlbiBpbml0aWFsaXppbmcgTGluay4gTm90ZSB0aGF0IGEgcHJvZHVjdCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIGFuIEl0ZW0gb25jZSB0aGUgSXRlbSBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoYXQgcHJvZHVjdC4gVG8gc3RvcCBiaWxsaW5nIG9uIGFuIEl0ZW0gZm9yIHN1YnNjcmlwdGlvbi1iYXNlZCBwcm9kdWN0cywgc3VjaCBhcyBMaWFiaWxpdGllcywgSW52ZXN0bWVudHMsIGFuZCBUcmFuc2FjdGlvbnMsIHJlbW92ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gdXNlIG9ubHkgaWYgdGhlIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50KHMpIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIHN1cHBvcnQgdGhlIHByb2R1Y3QuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gVGhlIHByb2R1Y3RzIHdpbGwgb25seSBiZSBleHRyYWN0ZWQgYW5kIGJpbGxlZCBpZiB0aGUgdXNlciBzZWxlY3RzIGFuIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50IHR5cGUgdGhhdCBzdXBwb3J0cyB0aGVtLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW1JlcXVpcmVkIGlmIFN1cHBvcnRlZCBQcm9kdWN0c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHRoYXQgeW91IG1heSB3aXNoIHRvIHVzZSBidXQgdGhhdCBhcmUgbm90IHJlcXVpcmVkIGZvciB5b3VyIHVzZSBjYXNlLiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gZmV0Y2ggZGF0YSBmb3IgdGhlc2UgcHJvZHVjdHMgb24gYSBiZXN0LWVmZm9ydCBiYXNpcywgYW5kIGZhaWx1cmUgdG8gc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIG5vdCBhZmZlY3QgSXRlbSBjcmVhdGlvbi4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5cy4gVGhlIGBwcm9kdWN0c2AgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGlzIGZlYXR1cmUsIHNlZSBbT3B0aW9uYWwgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNvcHRpb25hbC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbmFsX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAoQmV0YSkgVGhpcyBmaWVsZCBoYXMgbm8gZWZmZWN0IHVubGVzcyB5b3UgYXJlIHBhcnRpY2lwYXRpbmcgaW4gdGhlIFtEYXRhIFRyYW5zcGFyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpIGJldGEgcHJvZ3JhbS4gTGlzdCBvZiBhZGRpdGlvbmFsIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gY29sbGVjdCBjb25zZW50IGZvci4gVGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYmUgYmlsbGVkIHVudGlsIHlvdSBzdGFydCB1c2luZyB0aGVtIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IGVuZHBvaW50cy4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBoYXZlIGNvbnNlbnQgY29sbGVjdGVkLiAgSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiBMaW5rLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheXMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzdGluYXRpb24gVVJMIHRvIHdoaWNoIGFueSB3ZWJob29rcyBzaG91bGQgYmUgc2VudC4gTm90ZSB0aGF0IHdlYmhvb2tzIGZvciBQYXltZW50IEluaXRpYXRpb24gKGUtd2FsbGV0IHRyYW5zYWN0aW9ucyBvbmx5KSwgVHJhbnNmZXIsIEJhbmsgVHJhbnNmZXIgKGluY2x1ZGluZyBBdXRoIG1pY3JvLWRlcG9zaXQgbm90aWZpY2F0aW9uIHdlYmhvb2tzKSBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFyZSBjb25maWd1cmVkIHZpYSB0aGUgRGFzaGJvYXJkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSB0byB1cGRhdGUgb3IgcmVmZXJlbmNlLCB1c2VkIHdoZW4gdXBkYXRpbmcsIG1vZGlmeWluZywgb3IgYWNjZXNzaW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gLiBVc2VkIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHdoZW4gY29tcGxldGluZyB0aGUgU2FtZS1kYXkgKG1hbnVhbCkgTWljcm8tZGVwb3NpdCBmbG93LCBvciAob3B0aW9uYWxseSkgd2hlbiBpbml0aWFsaXppbmcgTGluayBmb3IgYSByZXR1cm5pbmcgdXNlciBhcyBwYXJ0IG9mIHRoZSBUcmFuc2ZlciBVSSBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbXMgdG8gdXBkYXRlIGluIExpbmsgdXBkYXRlIG1vZGUgZm9yIHRoZSBBc3NldHMgcHJvZHVjdC4gVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIHRoZSBgYWNjZXNzX3Rva2VuYCBmaWVsZCBhbGxvd3MgdGhlIHVwZGF0aW5nIG9mIG11bHRpcGxlIGl0ZW1zIGF0IG9uY2UuIFRoaXMgZmVhdHVyZSBpcyBpbiBjbG9zZWQgYmV0YSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mby5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMaW5rIGN1c3RvbWl6YXRpb24gZnJvbSB0aGUgUGxhaWQgRGFzaGJvYXJkIHRvIGJlIGFwcGxpZWQgdG8gTGluay4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBkZWZhdWx0YCBjdXN0b21pemF0aW9uIHdpbGwgYmUgdXNlZC4gV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGluIHRoZSBjdXN0b21pemF0aW9uIG11c3QgbWF0Y2ggdGhlIGxhbmd1YWdlIHNlbGVjdGVkIHZpYSB0aGUgYGxhbmd1YWdlYCBwYXJhbWV0ZXIsIGFuZCB0aGUgY291bnRyaWVzIGluIHRoZSBjdXN0b21pemF0aW9uIHNob3VsZCBtYXRjaCB0aGUgY291bnRyeSBjb2RlcyBzZWxlY3RlZCB2aWEgYGNvdW50cnlfY29kZXNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2N1c3RvbWl6YXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIHZpYSBhIHdlYnZpZXcuIFRoZSBgcmVkaXJlY3RfdXJpYCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50LCBtdXN0IGJlIGFuIGh0dHBzIFVSSS4gVG8gc3BlY2lmeSBhbnkgc3ViZG9tYWluLCB1c2UgYCpgIGFzIGEgd2lsZGNhcmQgY2hhcmFjdGVyLCBlLmcuIGBodHRwczovL18qLmV4YW1wbGUuY29tL29hdXRoLmh0bWxgLiBOb3RlIHRoYXQgYW55IHJlZGlyZWN0IFVSSSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgcmVkaXJlY3QgVVJJcyBsaXN0IGluIHRoZSBbZGV2ZWxvcGVyIGRhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKS4gSWYgaW5pdGlhbGl6aW5nIG9uIEFuZHJvaWQsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgaW5zdGVhZCBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIGxlZnQgYmxhbmsuIElmIHVzaW5nIEhvc3RlZCBMaW5rIChiZXRhKSB0aGUgYHJlZGlyZWN0X3VyaWAgbXVzdCBiZSBzZXQgdG8gYGh0dHBzOi8vaG9zdGVkLnBsYWlkLmNvbS9vYXV0aC9yZWRpcmVjdGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcFxcJ3MgQW5kcm9pZCBwYWNrYWdlLiBSZXF1aXJlZCBpZiB1c2luZyB0aGUgYGxpbmtfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBvbiBBbmRyb2lkLiBBbnkgcGFja2FnZSBuYW1lIHNwZWNpZmllZCBoZXJlIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCBBbmRyb2lkIHBhY2thZ2UgbmFtZXMgc2V0dGluZyBvbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIFdoZW4gY3JlYXRpbmcgYSBgbGlua190b2tlbmAgZm9yIGluaXRpYWxpemluZyBMaW5rIG9uIG90aGVyIHBsYXRmb3JtcywgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIGxlZnQgYmxhbmsgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFuZHJvaWRfcGFja2FnZV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9kYXRhPzogTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2FyZF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5BY2NvdW50RmlsdGVyc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IExpbmtUb2tlbkFjY291bnRGaWx0ZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5FVUNvbmZpZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV1X2NvbmZpZz86IExpbmtUb2tlbkVVQ29uZmlnO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGNlcnRhaW4gRXVyb3BlLW9ubHkgY29uZmlndXJhdGlvbnMsIGFzIHdlbGwgYXMgY2VydGFpbiBsZWdhY3kgdXNlIGNhc2VzIGluIG90aGVyIHJlZ2lvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlPzogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVwZGF0ZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHM7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIHRva2VuIGdlbmVyYXRlZCB1c2luZyBgL3VzZXIvY3JlYXRlYC4gQW55IEl0ZW0gY3JlYXRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IExpbmtUb2tlbkludmVzdG1lbnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c19hdXRoPzogTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaG9zdGVkX2xpbms/OiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5UcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBMaW5rVG9rZW5UcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCByZXF1ZXN0IGEgQ1JBIGNvbm5lY3Rpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmFfZW5hYmxlZD86IGJvb2xlYW47XG59XG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBvbmx5IGRpc3BsYXkgYWNjb3VudCB0eXBlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGluc3RpdHV0aW9ucyBvciBhY2NvdW50cyBzaG93biBieSB0aGUgYmFuayBpbiB0aGUgT0F1dGggd2luZG93LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEF1dGggcHJvZHVjdC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlbmRlZCBBdXRoIGZsb3dzIGZvciB0aGUgcmVzdWx0aW5nIExpbmsgc2Vzc2lvbi4gT21pdHRpbmcgYW55IGZpZWxkIHdpbGwgcmVzdWx0IGluIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBBdXRoIFR5cGUgU2VsZWN0IGlzIGVuYWJsZWQgZm9yIHRoZSBMaW5rIHNlc3Npb24sIGFsbG93aW5nIHRoZSBlbmQgdXNlciB0byBjaG9vc2UgYmV0d2VlbiBsaW5raW5nIGluc3RhbnRseSBvciBtYW51YWxseSBwcmlvciB0byBzZWxlY3RpbmcgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSB0cnVlIGlmIGBzYW1lX2RheV9taWNyb2RlcG9zaXRzX2VuYWJsZWRgIGlzIHNldCB0byB0cnVlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNYXRjaCBmbG93LiBBcyBvZiBOb3ZlbWJlciAyMDIyLCBJbnN0YW50IE1hdGNoIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiBJbnN0YW50IE1hdGNoIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoaXMgZmllbGQgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBpbnN0YW50X21hdGNoX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgc2FtZV9kYXlfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBJbnN0YW50IE1pY3JvLWRlcG9zaXRzIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGF0IHR5cGUgb2YgW1Jlcm91dGUgdG8gQ3JlZGVudGlhbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9zYW1lLWRheS8jcmVyb3V0ZS10by1jcmVkZW50aWFscykgcGFuZSBzaG91bGQgYmUgdXNlZCBpbiB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gQXMgb2YgT2N0b2JlciAxNSAyMDIzLCB0aGUgZGVmYXVsdCBzZXR0aW5nIGlzIGBPUFRJT05BTGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICByZXJvdXRlX3RvX2NyZWRlbnRpYWxzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhSZXJvdXRlVG9DcmVkZW50aWFsc0VudW07XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgRGF0YWJhc2UgTWF0Y2ggZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZsb3dfdHlwZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtIHtcbiAgICBPZmYgPSAnT0ZGJyxcbiAgICBPcHRpb25hbCA9ICdPUFRJT05BTCcsXG4gICAgRm9yY2VkID0gJ0ZPUkNFRCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW0ge1xuICAgIEZsZXhpYmxlQXV0aCA9ICdGTEVYSUJMRV9BVVRIJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGFzc2V0c2AgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIHRoZSBjbGllbnQgaXMgQ1JBLWVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIERlcG9zaXQgU3dpdGNoIChiZXRhKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBkZXBvc2l0X3N3aXRjaGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBgZGVwb3NpdF9zd2l0Y2hfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBFbXBsb3ltZW50IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2Ygc291cmNlIGVtcGxveW1lbnQgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95bWVudFNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfc291cmNlX3R5cGVzPzogQXJyYXk8RW1wbG95bWVudFNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgRW1wbG95bWVudC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZW1wbG95bWVudGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIGBiYW5rYCBpcyBzcGVjaWZpZWQgaW4gYGVtcGxveW1lbnRfc291cmNlX3R5cGVzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBFbXBsb3ltZW50IHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbiBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBJbmNvbWUgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIG9mIHRoZSB2ZXJpZmljYXRpb24gaW5zdGFuY2UsIGFzIHByb3ZpZGVkIGJ5IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIG9mIGFuIGFzc2V0IHJlcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGFzIHByb3ZpZGVkIGJ5IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFByb3ZpZGluZyBhbiBgYXNzZXRfcmVwb3J0X2lkYCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB1c2VyIHRocm91Z2ggYSBzdHJlYW1saW5lZCBmbG93LiBJZiBwcm92aWRlZCwgdGhlIGJhbmsgbGlua2luZyBmbG93IHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyB0aGF0IGEgdXNlciBoYXMgcHJldmlvdXNseSBjb25uZWN0ZWQgd2l0aC4gRGF0YSBmcm9tIHRoZXNlIGluc3RpdHV0aW9ucyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBkb2N1bWVudCBkYXRhIHJlY2VpdmVkIGR1cmluZyB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gaGVscCB2ZXJpZnkgdGhhdCB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGFyZSBhY2N1cmF0ZS4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlc2UgSXRlbXMgZHVyaW5nIGxpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uICBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgYHBheXJvbGxgIGluY29tZSBzb3VyY2UgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2Ygc291cmNlIGluY29tZSBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWU7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVzZXIgc3RhdGVkIGluY29tZSBzb3VyY2VzXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXRlZF9pbmNvbWVfc291cmNlcz86IEFycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIGBiYW5rYCBpcyBzcGVjaWZpZWQgaW4gYGluY29tZV9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBJbmNvbWUgcHJvZHVjdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBtdWx0aXBsZSBJdGVtcyB0byBiZSBhZGRlZCBpbiB0aGUgTGluayBzZXNzaW9uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZW5hYmxlX211bHRpcGxlX2l0ZW1zPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGF5cm9sbCBJbmNvbWUgKGluY2x1ZGluZyBEb2N1bWVudCBJbmNvbWUpLiBGdXJ0aGVyIGN1c3RvbWl6YXRpb24gb3B0aW9ucyBmb3IgRG9jdW1lbnQgSW5jb21lLCBzdWNoIGFzIGN1c3RvbWl6aW5nIHdoaWNoIGRvY3VtZW50IHR5cGVzIG1heSBiZSB1cGxvYWRlZCwgYXJlIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgW0xpbmsgQ3VzdG9taXphdGlvbiBwYW5lXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vbGluaykgaW4gdGhlIERhc2hib2FyZC4gKFJlcXVpcmVzIFByb2R1Y3Rpb24gZW5hYmxlbWVudC4pXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gdG8gZW5hYmxlIGZvciB0aGUgTGluayBzZXNzaW9uLiBJZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlcnMgd2lsbCBzZWUgYm90aCBkb2N1bWVudCBhbmQgZGlnaXRhbCBwYXlyb2xsIGluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBmbG93X3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIExpbmsgdG9rZW4gd2lsbCBiZSB1c2VkIGZvciB1cGRhdGUgbW9kZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBpc191cGRhdGVfbW9kZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBJdGVtIHRvIHVwZGF0ZSB3aXRoLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGl0ZW1faWRfdG9fdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCB1cGxvYWRzLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBkb2NzIHdpbGwgdW5kZXJnbyBPQ1IgcGFyc2luZyBvbmx5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+IHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFN0YXRlbWVudHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDMgbW9udGhzIHByaW9yIHRvIHRoZSBjdXJyZW50IGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkg4oCcWVlZWS1NTS1EROKAnSBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4gWW91IGNhbiByZXF1ZXN0IHVwIHRvIHR3byB5ZWFycyBvZiBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFRyYW5zZmVyIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBlbmFibGVzIFt1cGRhdGUgbW9kZSB3aXRoIEFjY291bnQgU2VsZWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSBmb3IgaW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHVzZSBPQXV0aCwgb3IgdGhhdCB1c2UgT0F1dGggYnV0IGRvIG5vdCBoYXZlIHRoZWlyIG93biBhY2NvdW50IHNlbGVjdGlvbiBmbG93LiBGb3IgaW5zdGl0dXRpb25zIHRoYXQgaGF2ZSBhbiBPQXV0aCBhY2NvdW50IHNlbGVjdGlvbiBmbG93IChpLmUuIG1vc3QgT0F1dGgtZW5hYmxlZCBpbnN0aXR1dGlvbnMpLCB1cGRhdGUgbW9kZSB3aXRoIEFjY291bnQgU2VsZWN0IHdpbGwgYWx3YXlzIGJlIGVuYWJsZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X3NlbGVjdGlvbl9lbmFibGVkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyIHdobyB3aWxsIGJlIGxpbmtpbmcgdGhlaXIgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC4gSXQgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBtZWFucyBvZiBzZWFyY2hpbmcgbG9ncyBmb3IgdGhlIGdpdmVuIHVzZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZSwgdXNlZCBmb3IgW21pY3JvLWRlcG9zaXQgYmFzZWQgdmVyaWZpY2F0aW9uIGZsb3dzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS4gRm9yIGEgc21hbGwgbnVtYmVyIG9mIGN1c3RvbWVycyBvbiBsZWdhY3kgZmxvd3MsIHByb3ZpZGluZyB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBtaWNyby1kZXBvc2l0LWJhc2VkIGZsb3dzLiBGb3IgYWxsIG90aGVyIGN1c3RvbWVycywgdGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gUHJvdmlkaW5nIHRoZSB1c2VyXFwncyBuYW1lIGluIHRoaXMgZmllbGQgd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiB3aWxsIHN0cmVhbWxpbmUgdGhlIGVuZCB1c2VyIGV4cGVyaWVuY2UsIGFzIHRoZSB1c2VyIHdpbGwgbm90IGJlIHByb21wdGVkIHRvIGVudGVyIHRoZWlyIG5hbWUgZHVyaW5nIHRoZSBMaW5rIGZsb3c7IFBsYWlkIHdpbGwgdXNlIHRoZSBwcm92aWRlZCBsZWdhbCBuYW1lIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiBDYW4gYWxzbyBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBwaG9uZSBudW1iZXIgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZS4gICBPbmx5IHBhc3MgYSB2ZXJpZmljYXRpb24gdGltZSBmb3IgYSBwaG9uZSBudW1iZXIgdGhhdCB5b3UgaGF2ZSB2ZXJpZmllZC4gSWYgeW91IGhhdmUgcGVyZm9ybWVkIHZlcmlmaWNhdGlvbiBidXQgZG9u4oCZdCBoYXZlIHRoZSB0aW1lLCB5b3UgbWF5IHN1cHBseSBhIHNpZ25hbCB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIFVOSVggZXBvY2guICAgRXhhbXBsZTogYDIwMjAtMDEtMDFUMDA6MDA6MDBaYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyX3ZlcmlmaWVkX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLCBidXQgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSBbcHJlLWF1dGhlbnRpY2F0ZWQgcmV0dXJuaW5nIHVzZXIgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyLyNwcmUtYXV0aGVudGljYXRlZC1ydXgpLiBDYW4gYWxzbyBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgZW1haWwgYWRkcmVzcyB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhbiBlbWFpbCBhZGRyZXNzIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvbuKAmXQgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc192ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIGFuZCBub3QgY3VycmVudGx5IHVzZWQsIHVzZSB0aGUgYGlkX251bWJlcmAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBDYW4gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyB1c2VyIHN0YXRlZCBpbmNvbWUgc291cmNlcyBmb3IgdGhlIEluY29tZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBjb3JyZXNwb25kaW5nIHRvIGFuIGluY29tZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgcGVyIGN5Y2xlIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfcGVyX2N5Y2xlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgYW5udWFsbHkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9hbm51YWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV90eXBlPzogVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3k7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIGZvciBhbiBleGlzdGluZyBJdGVtIChzdWNoIGFzIHdoZW4gdXBkYXRpbmcgYW4gZXhpc3RpbmcgYGFjY2Vzc190b2tlbmAgYnkgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUpIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkwgb2YgYSBQbGFpZC1ob3N0ZWQgTGluayBmbG93IHRoYXQgd2lsbCB1c2UgdGhlIExpbmsgdG9rZW4gcmV0dXJuZWQgYnkgdGhpcyByZXF1ZXN0LiBPbmx5IHByZXNlbnQgaWYgdGhlIGNsaWVudCBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluayAoYmV0YSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBob3N0ZWRfbGlua191cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgRVUgZmxvd3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5FVUNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBvcGVuIExpbmsgd2l0aG91dCBhbiBpbml0aWFsIFVJLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5FVUNvbmZpZ1xuICAgICAqL1xuICAgIGhlYWRsZXNzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50cyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWN0c2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGB3ZWJob29rYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb3VudHJ5X2NvZGVzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGxhbmd1YWdlYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9kYXRhPzogTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50RmlsdGVyc1Jlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogQWNjb3VudEZpbHRlcnNSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlZGlyZWN0X3VyaWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfbmFtZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX3Rva2VuYCBmcm9tIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5mb3JtYXRpb24gYWJvdXQgTGluayBzZXNzaW9ucyBjcmVhdGVkIHVzaW5nIHRoaXMgYGxpbmtfdG9rZW5gLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHlvdXIgY2xpZW50IGlzIGVuYWJsZWQgZm9yIEhvc3RlZCBMaW5rIChiZXRhKS4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbnM/OiBBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgbGluayBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHlvdXIgY2xpZW50IGlzIGVuYWJsZWQgZm9yIEhvc3RlZCBMaW5rIChiZXRhKS4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgbGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpcnN0IHN0YXJ0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RhcnRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpbmlzaGVkLCBpZiBhdmFpbGFibGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZmluaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbl9zdWNjZXNzPzogTGlua1Nlc3Npb25TdWNjZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgb25fZXhpdD86IExpbmtTZXNzaW9uRXhpdCB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyBzZWxmLWN1c3RvZHkgY3J5cHRvIHdhbGxldHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd191bnZlcmlmaWVkX2NyeXB0b193YWxsZXRzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGVudGVyIEludmVzdG1lbnRzIGFjY291bnQgYW5kIGhvbGRpbmdzIGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X21hbnVhbF9lbnRyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIEF1dGggUHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlblRyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBhZnRlciBEZWNlbWJlciAzLCAyMDIzLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBvbiBEZWNlbWJlciAzLCAyMDIzIG9yIGVhcmxpZXIsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gNzMwIGRheXMgdW50aWwgSnVuZSAyNCwgMjAyNCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuICBXZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCBjdXN0b21lcnMgdXRpbGl6aW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IGZvciBvcHRpbWFsIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdlYmhvb2sgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIHRvIGEgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS19ERUxJVkVSWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUxJVkVSWV9TVEFUVVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfbWV0YWRhdGE6IExpbmtEZWxpdmVyeU1ldGFkYXRhO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW4ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIExvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBMb2FuSWRlbnRpZmllcnM7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGxvYW4gYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1sb2FuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5BY2NvdW50U3VidHlwZSB7XG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBDb25zdHJ1Y3Rpb24gPSAnY29uc3RydWN0aW9uJyxcbiAgICBDb25zdW1lciA9ICdjb25zdW1lcicsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBsb2FuYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5GaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuRmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbG9hbiBieSB2YXJpb3VzIHBhcnRpZXMgdG8gdGhlIHRyYW5zYWN0aW9uIG9yIG90aGVyIG9yZ2FuaXphdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllclR5cGU6IExvYW5JZGVudGlmaWVyVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBsb2FuIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuSWRlbnRpZmllclR5cGUge1xuICAgIExlbmRlckxvYW4gPSAnTGVuZGVyTG9hbicsXG4gICAgVW5pdmVyc2FsTG9hbiA9ICdVbml2ZXJzYWxMb2FuJ1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgY3VycmVudCBhbmQgcHJldmlvdXMgaWRlbnRpZmllcnMgZm9yIHRoaXMgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogTG9hbklkZW50aWZpZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FufVxuICAgICAqIEBtZW1iZXJvZiBMb2Fuc1xuICAgICAqL1xuICAgIExPQU46IExvYW47XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2Ygd2hlcmUgYSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGl0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxhdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbG9uZ2l0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgZGVmaW5lZCBzdG9yZSBudW1iZXIgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgc3RvcmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG11bHRpLWZhY3RvciBhdXRoZW50aWNhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2l0aCB0aGlzIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNRkFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNRkEge1xuICAgIC8qKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgYGRldmljZWAsIGBzZWxlY3Rpb25zYCwgb3IgYHF1ZXN0aW9uc2AuICBJZiB2YWx1ZSBpcyBgZGV2aWNlYCwgdGhlIE1GQSBhbnN3ZXIgaXMgYDEyMzRgLiAgSWYgdmFsdWUgaXMgYHNlbGVjdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyBhbHdheXMgdGhlIGZpcnN0IG9wdGlvbi4gIElmIHZhbHVlIGlzIGBxdWVzdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyAgYGFuc3dlcl88aT5fPGo+YCBmb3IgdGhlIGotdGggcXVlc3Rpb24gaW4gdGhlIGktdGggcm91bmQsIHN0YXJ0aW5nIGZyb20gMC4gRm9yIGV4YW1wbGUsIHRoZSBhbnN3ZXIgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIGluIHRoZSBzZWNvbmQgcm91bmQgaXMgYGFuc3dlcl8xXzBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHF1ZXN0aW9ucy4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBxdWVzdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgcXVlc3Rpb25zIHBlciByb3VuZC4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBJZiB2YWx1ZSBvZiB0eXBlIGlzIGBzZWxlY3Rpb25zYCwgZGVmYXVsdCB2YWx1ZSBpcyAyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uc19wZXJfcm91bmQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHNlbGVjdGlvbnMsIHVzZWQgaWYgYHR5cGVgIGlzIGBzZWxlY3Rpb25zYC4gRGVmYXVsdHMgdG8gMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25fcm91bmRzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGF2YWlsYWJsZSBhbnN3ZXJzIHBlciBxdWVzdGlvbiwgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbmAuIERlZmF1bHRzIHRvIDIuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbnNfcGVyX3F1ZXN0aW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFN1bW1hcnkgb2JqZWN0IHJlZmxlY3RpbmcgdGhlIG1hdGNoIHJlc3VsdCBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1hdGNoU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIE1hdGNoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB0aGUgbWF0Y2ggdHlwZSBiZXR3ZWVuIGRhdGEgcHJvdmlkZWQgYnkgdXNlciBhbmQgZGF0YSBjaGVja2VkIGFnYWluc3QgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UuICAgYG1hdGNoYCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YSB3YXMgYSBzdHJvbmcgbWF0Y2ggYWdhaW5zdCBleHRlcm5hbCBkYXRhLiAgYHBhcnRpYWxfbWF0Y2hgIGluZGljYXRlcyB0aGUgZGF0YSBhcHByb3hpbWF0ZWx5IG1hdGNoZWQgYWdhaW5zdCBleHRlcm5hbCBkYXRhLiBGb3IgZXhhbXBsZSwgXFxcIktub3BlXFxcIiB2cy4gXFxcIktub3BlLVd5YXR0XFxcIiBmb3IgbGFzdCBuYW1lLiAgYG5vX21hdGNoYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSBhbmQgaXQgZGlkIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIGZpbmQgZXh0ZXJuYWwgZGF0YSB0byBjb21wYXJlIGFnYWluc3QgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9faW5wdXRgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gcGVyZm9ybSBhIGNoZWNrIGJlY2F1c2Ugbm8gaW5mb3JtYXRpb24gd2FzIHByb3ZpZGVkIGZvciB0aGlzIGZpZWxkIGJ5IHRoZSBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnLFxuICAgIE5vSW5wdXQgPSAnbm9faW5wdXQnXG59XG5cbi8qKlxuICogSW5zaWdodHMgaW50byBhIHVzZXLigJlzIHRvcCBtZXJjaGFudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1lcmNoYW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJjaGFudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBtZXJjaGFudCBvZiB0aGlzIHR5cGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9wcmltYXJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRhaWxlZCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIEFsbG93cyBzcGVjaWZ5aW5nIHRoZSBtZXRhZGF0YSBvZiB0aGUgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1ldGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG9mZmljaWFsIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBsaW1pdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBtYXNrLiBTaG91bGQgYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIG9mIDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gVGhpcyBhbGxvd3MgeW91IHRvIG1vZGVsIGEgbWFzayB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgKHN1Y2ggYXMgd2l0aCBhIHZpcnR1YWwgYWNjb3VudCBudW1iZXIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSBpbnRlcmVzdCByYXRlIGZvciB0aGUgbW9ydGdhZ2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGUge1xuICAgIC8qKlxuICAgICAqIFBlcmNlbnRhZ2UgdmFsdWUgKGludGVyZXN0IHJhdGUgb2YgY3VycmVudCBtb3J0Z2FnZSwgbm90IEFQUikgb2YgaW50ZXJlc3QgcGF5YWJsZSBvbiBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGludGVyZXN0IGNoYXJnZWQgKGZpeGVkIG9yIHZhcmlhYmxlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBtb3J0Z2FnZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgb3V0c3RhbmRpbmcgYW1vdW50IGNoYXJnZWQgZm9yIGxhdGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGN1cnJlbnRfbGF0ZV9mZWU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IGhlbGQgaW4gZXNjcm93IHRvIHBheSB0YXhlcyBhbmQgaW5zdXJhbmNlIG9uIGJlaGFsZiBvZiB0aGUgYm9ycm93ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBlc2Nyb3dfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgaGFzIHByaXZhdGUgbW9ydGdhZ2UgaW5zdXJhbmNlIGluIGVmZmVjdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcG1pOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgd2lsbCBwYXkgYSBwZW5hbHR5IGZvciBlYXJseSBwYXlvZmYgb2YgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3ByZXBheW1lbnRfcGVuYWx0eTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlSW50ZXJlc3RSYXRlfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGludGVyZXN0X3JhdGU6IE1vcnRnYWdlSW50ZXJlc3RSYXRlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3QgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBsb2FuLCBmb3IgZXhhbXBsZSBgY29udmVudGlvbmFsYCwgYGZpeGVkYCwgb3IgYHZhcmlhYmxlYC4gVGhpcyBmaWVsZCBpcyBwcm92aWRlZCBkaXJlY3RseSBmcm9tIHRoZSBsb2FuIHNlcnZpY2VyIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGVudW1lcmF0ZWQgc2V0IG9mIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdHlwZV9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGdWxsIGR1cmF0aW9uIG9mIG1vcnRnYWdlIGFzIGF0IG9yaWdpbmF0aW9uIChlLmcuIGAxMCB5ZWFyYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3Rlcm06IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYWwgZGF0ZSBvbiB3aGljaCBtb3J0Z2FnZSBpcyBkdWUgaW4gZnVsbC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtYXR1cml0eV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIG5leHQgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfbW9udGhseV9wYXltZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHByaW5jaXBhbCBiYWxhbmNlIG9mIHRoZSBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGxvYW4gKHByaW5jaXBhbCArIGludGVyZXN0KSBwYXN0IGR1ZSBmb3IgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHBhc3RfZHVlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcHJvcGVydHlfYWRkcmVzczogTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBpbnRlcmVzdCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFlURCBwcmluY2lwYWwgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9wcmluY2lwYWxfcGFpZDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIGRlc2NyaWJpbmcgcHJvcGVydHkgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXZlIG9yIG5pbmUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIChleGFtcGxlIFxcXCJOQ1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIChleGFtcGxlIFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFwdCAxNVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCBjb3VsZCBpbmRpY2F0ZSBpZiBhIGRvY3VtZW50IGlzIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBkb2N1bWVudF9yZWZlcmVuY2VzOiBBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBzZXQgb2YgZG9jdW1lbnRzXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zaWduYWxzOiBBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBuYW1lIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgbmFtZSBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmFtZU1hdGNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIG5hbWUuIDEwMCBpcyBhIHBlcmZlY3Qgc2NvcmUsIDk5LTg1IG1lYW5zIGEgc3Ryb25nIG1hdGNoLCA4NC03MCBpcyBhIHBhcnRpYWwgbWF0Y2gsIGFueSBzY29yZSBsZXNzIHRoYW4gNzAgaXMgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBuYW1lIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBmaXJzdCBvciBsYXN0IG5hbWUgY29tcGxldGVseSBtYXRjaGVkLCBsaWtlbHkgYSBmYW1pbHkgbWVtYmVyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfZmlyc3RfbmFtZV9vcl9sYXN0X25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBuaWNrbmFtZSBtYXRjaGVkLCBleGFtcGxlIEplbm5pZmVyIGFuZCBKZW5uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX25pY2tuYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSXMgYHRydWVgIGlmIHRoZSBuYW1lIG9uIGVpdGhlciBvZiB0aGUgbmFtZXMgdGhhdCB3YXMgbWF0Y2hlZCBmb3IgdGhlIHNjb3JlIGNvbnRhaW5lZCBzdHJpbmdzIGluZGljYXRpdmUgb2YgYSBidXNpbmVzcyBuYW1lLCBzdWNoIGFzIFxcXCJDT1JQXFxcIiwgXFxcIkxMQ1xcXCIsIFxcXCJJTkNcXFwiLCBvciBcXFwiTFREXFxcIi4gQSBgdHJ1ZWAgcmVzdWx0IGdlbmVyYWxseSBpbmRpY2F0ZXMgdGhlIGVudGl0eSBpcyBhIGJ1c2luZXNzLiBIb3dldmVyLCBhIGBmYWxzZWAgcmVzdWx0IGRvZXMgbm90IG1lYW4gdGhlIGVudGl0eSBpcyBub3QgYSBidXNpbmVzcywgYXMgc29tZSBidXNpbmVzc2VzIGRvIG5vdCB1c2UgdGhlc2Ugc3RyaW5ncyBpbiB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNfYnVzaW5lc3NfbmFtZV9kZXRlY3RlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWx9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWw/OiBUb3RhbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBkZXRlY3RzIGEgbmV3IGFjY291bnQgZm9yIEl0ZW1zIGNyZWF0ZWQgb3IgdXBkYXRlZCB3aXRoIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KS4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgY2FuIHByb21wdCB5b3VyIHVzZXJzIHRvIHNoYXJlIG5ldyBhY2NvdW50cyB3aXRoIHlvdSB0aHJvdWdoIFtBY2NvdW50IFNlbGVjdCB2MiB1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF93aXJlX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGluc3RpdHV0aW9uIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfYnJhbmNoYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2luc3RpdHV0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBicmFuY2ggbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9pbnN0aXR1dGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9icmFuY2g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFuayBpZGVudGlmaWVyIGNvZGUgKEJJQykuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9pYmFuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9iaWM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgbnVtYmVyIChJQkFOKS4gSWYgbm8gYWNjb3VudCBudW1iZXIgaXMgc3BlY2lmaWVkIHZpYSBgYWNjb3VudGAsIHdpbGwgYWxzbyBiZSB1c2VkIGFzIHRoZSBhY2NvdW50IG51bWJlciBieSBkZWZhdWx0LiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfYmljYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9pYmFuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJBQ1Mgc29ydCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3Nfc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFDQVRTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNBVFNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNBVFMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVycyBmb3IgdGhlIGNsZWFyaW5naG91c2VzIHRoYXQgYXJlIGFzc29jY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaW4gb3JkZXIgb2YgcmVsZXZhbmNlLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgd2UgY2FuXFwndCBwcm92aWRlIGFueSBhY2NvdW50IGxldmVsIGRhdGEuIEluc3RpdHV0aW9uIGxldmVsIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbnN0aXR1dGlvbnMvZ2V0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgZHRjX251bWJlcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNIXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgT0F1dGggd2l0aCBDaGFzZSBCYW5rIChgaW5zXzU2YCksIENoYXNlIHdpbGwgaXNzdWUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGVzZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIChhbHNvIGtub3duIGFzIFRBTnMpIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIGBtYXNrYCBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcjsgZm9yIHRoaXMgcmVhc29uLCB3aGVuIGRpc3BsYXlpbmcgYWNjb3VudCBudW1iZXJzIHRvIHRoZSB1c2VyIHRvIGhlbHAgdGhlbSBpZGVudGlmeSB0aGVpciBhY2NvdW50IGluIHlvdXIgVUksIGFsd2F5cyB1c2UgdGhlIGBtYXNrYCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIHRoZSBgYWNjb3VudGAgbnVtYmVyLiBJZiBhIHVzZXIgcmV2b2tlcyB0aGVpciBwZXJtaXNzaW9ucyB0byB5b3VyIGFwcCwgdGhlIHRva2VuaXplZCBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gSWYgdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfNTZgLCB0aGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBhY2NvdW50YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCB3aGVuIHVzaW5nIE9BdXRoIHdpdGggQ2hhc2UgQmFuayAoYGluc181NmApLCBDaGFzZSB3aWxsIGlzc3VlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlc2UgdG9rZW5pemVkIGFjY291bnQgbnVtYmVycyAoYWxzbyBrbm93biBhcyBUQU5zKSBzaG91bGQgd29yayBpZGVudGljYWxseSB0byBub3JtYWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGUgZGlnaXRzIHJldHVybmVkIGluIHRoZSBgbWFza2AgZmllbGQgd2lsbCBjb250aW51ZSB0byByZWZsZWN0IHRoZSBhY3R1YWwgYWNjb3VudCBudW1iZXIsIHJhdGhlciB0aGFuIHRoZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXI7IGZvciB0aGlzIHJlYXNvbiwgd2hlbiBkaXNwbGF5aW5nIGFjY291bnQgbnVtYmVycyB0byB0aGUgdXNlciB0byBoZWxwIHRoZW0gaWRlbnRpZnkgdGhlaXIgYWNjb3VudCBpbiB5b3VyIFVJLCBhbHdheXMgdXNlIHRoZSBgbWFza2AgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgYGFjY291bnRgIG51bWJlci4gSWYgYSB1c2VyIHJldm9rZXMgdGhlaXIgcGVybWlzc2lvbnMgdG8geW91ciBhcHAsIHRoZSB0b2tlbml6ZWQgbnVtYmVycyB3aWxsIG5vIGxvbmdlciB3b3JrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gSWYgdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfNTZgLCB0aGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBhY2NvdW50YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LCBpZiBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIGludG8gdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfb3V0PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQVRPTi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FUT05cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQVRPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJBQ1MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBDYW5hZGlhbiBiYW5rIGFjY291bnQgdmlhIEVGVC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlIHtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYW5rIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IG51bWJlcnMgdXNpbmcgdGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciBhbmQgQklDL1NXSUZUIGNvZGUgZm9ybWF0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU4ge1xuICAgIC8qKlxuICAgICAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUsIGFsc28ga25vd24gYXMgU1dJRlQgY29kZSwgZm9yIHRoaXMgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYW4gaW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgdmlhIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPbWl0dGFibGVUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIG9wdGlvbiBzZWN1cml0eS4gIEZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBkYXRhIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgaXRlbSBpcyB1c2luZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCwgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xuICAgIC8qKlxuICAgICAqIGRvY3VtZW50X2lkIGlzIHRoZSBpZCBvZiB0aGUgZG9jdW1lbnQgdGhhdCB0aGlzIGlkZW50aXR5IGJlbG9uZ3MgdG9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgb3duZXIgb3Igb3duZXJzIG9mIGFuIGFjY291bnQuIEFueSBmaWVsZHMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGRlZmF1bHQgU2FuZGJveCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbmFtZXMgb2YgaW5kaXZpZHVhbHMsIGV2ZW4gZm9yIGJ1c2luZXNzIGFjY291bnRzLiBOb3RlIHRoYXQgdGhlIHNhbWUgbmFtZSBkYXRhIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBIb3cgYW4gYXNzZXQgaXMgb3duZWQuICBgYXNzb2NpYXRpb25gOiBPd25lcnNoaXAgYnkgYSBjb3Jwb3JhdGlvbiwgcGFydG5lcnNoaXAsIG9yIHVuaW5jb3Jwb3JhdGVkIGFzc29jaWF0aW9uLCBpbmNsdWRpbmcgZm9yLXByb2ZpdCBhbmQgbm90LWZvci1wcm9maXQgb3JnYW5pemF0aW9ucy4gYGluZGl2aWR1YWxgOiBPd25lcnNoaXAgYnkgYW4gaW5kaXZpZHVhbC4gYGpvaW50YDogSm9pbnQgb3duZXJzaGlwIGJ5IG11bHRpcGxlIHBhcnRpZXMuIGB0cnVzdGA6IE93bmVyc2hpcCBieSBhIHJldm9jYWJsZSBvciBpcnJldm9jYWJsZSB0cnVzdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE93bmVyc2hpcFR5cGUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgSW5kaXZpZHVhbCA9ICdpbmRpdmlkdWFsJyxcbiAgICBKb2ludCA9ICdqb2ludCcsXG4gICAgQXNzb2NpYXRpb24gPSAnYXNzb2NpYXRpb24nLFxuICAgIFRydXN0ID0gJ3RydXN0J1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGEgcG9zdCBvZmZpY2UgYm94LiBXaWxsIGJlIGB5ZXNgIHdoZW4gYSBQLk8uIGJveCBpcyBkZXRlY3RlZCwgYG5vYCB3aGVuIFBsYWlkIGNvbmZpcm1lZCB0aGUgYWRkcmVzcyBpcyBub3QgYSBQLk8uIGJveCwgYW5kIGBub19kYXRhYCB3aGVuIFBsYWlkIHdhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIGFkZHJlc3MgaXMgYSBQLk8uIGJveC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBPQm94U3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0dWRlbnRcXCdzIGVsaWdpYmlsaXR5IGluIHRoZSBQdWJsaWMgU2VydmljZSBMb2FuIEZvcmdpdmVuZXNzIHByb2dyYW0uIFRoaXMgaXMgb25seSByZXR1cm5lZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMgRmVkTG9hbiAoYGluc18xMTY1MjdgKS4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlY2huaWNhbF9jb250YWN0PzogUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3R9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbWVyX3N1cHBvcnRfaW5mbz86IFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm87XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgcGFydG5lciBoYXMgZm9yd2FyZGVkIHRoZSBQbGFpZCBiYW5rIGFkZGVuZHVtIHRvIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19iYW5rX2FkZGVuZHVtX2NvbXBsZXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRzX3VuZGVyX21hbmFnZW1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFVSSXMgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24ocykgd2hlcmUgYSB1c2VyIGNhbiBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciB2aWEgYSB3ZWJ2aWV3LiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQsIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYW4gZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRzIHVuZGVyIG1hbmFnZW1lbnQgZm9yIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuIFJlcXVpcmVkIGZvciBlbmQgY3VzdG9tZXJzIHdpdGggbW9udGhseSBzZXJ2aWNlIGNvbW1pdG1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBiaWxsaW5nIGNvbnRhY3QgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGJpbGxpbmcgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1YmxpYy4gVXNlcnMgb2YgeW91ciBhcHAgd2lsbCBzZWUgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIG1hbmFnaW5nIGNvbm5lY3Rpb25zIGJldHdlZW4geW91ciBhcHAgYW5kIHRoZWlyIGJhbmsgYWNjb3VudHMgaW4gUGxhaWQgUG9ydGFsLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBjdXN0b21lciBzdXBwb3J0IGluZm8gaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBjb250YWN0X3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgbGlua191cGRhdGVfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBhZGRlbmR1bSB0byB0aGUgUGxhaWQgTVNBIChcXFwiZmxvd2Rvd25cXFwiKSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBJblJldmlldyA9ICdJTl9SRVZJRVcnLFxuICAgIE5lZ290aWF0aW9uID0gJ05FR09USUFUSU9OJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgT0F1dGggcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGVudmlyb25tZW50cz86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHM7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gd2FzIGFwcHJvdmVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZWlyIGFwcGxpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fZW5hYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCBub24tT0F1dGggSXRlbSBhZGRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZGF0ZSBoYXMgYmVlbiBzZXQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjbGFzc2ljX2Rpc2FibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIEVuYWJsZWQgPSAnRU5BQkxFRCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnQVRURU5USU9OX1JFUVVJUkVEJ1xufVxuXG4vKipcbiAqIFJlZ2lzdHJhdGlvbiBzdGF0dXNlcyBieSBlbnZpcm9ubWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIE9BdXRoIHN0YXR1cyBvZiB0aGUgdXBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnbm90LXN0YXJ0ZWQnLFxuICAgIFByb2Nlc3NpbmcgPSAncHJvY2Vzc2luZycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIEVuYWJsZWQgPSAnZW5hYmxlZCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnYXR0ZW50aW9uLXJlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIG9mIHR5cGUgYFBBUlRORVJgIGFuZCBjb2RlIGBFTkRfQ1VTVE9NRVJfT0FVVEhfU1RBVFVTX1VQREFURURgIHdpbGwgYmUgZmlyZWQgd2hlbiBhIHBhcnRuZXJcXCdzIGVuZCBjdXN0b21lciBoYXMgYW4gdXBkYXRlIG9uIHRoZWlyIE9BdXRoIHJlZ2lzdHJhdGlvbiBzdGF0dXMgd2l0aCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjdXJpdHkgcXVlc3Rpb25uYWlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFJlY2VpdmVkID0gJ1JFQ0VJVkVEJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyIGluIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHNcbiAgICAgKi9cbiAgICBzYW5kYm94Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgZGV2ZWxvcG1lbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gIGBVTkRFUl9SRVZJRVdgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy4gVGhlIGVuZCBjdXN0b21lciBtdXN0IGJlIG1hbnVhbGx5IHJldmlld2VkIGJ5IHRoZSBQbGFpZCB0ZWFtIGJlZm9yZSBpdCBjYW4gYmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gUHJvZHVjdGlvbi4gIGBBQ1RJVkVgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGVuYWJsZWQgaW4gYWxsIGVudmlyb25tZW50cy4gIGBERU5JRURgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cywgYnV0IGl0IGRpZCBub3QgcGFzcyByZXZpZXcgYnkgdGhlIFBsYWlkIHRlYW0gYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGFsayB0byB5b3VyIEFjY291bnQgTWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cyB7XG4gICAgVW5kZXJSZXZpZXcgPSAnVU5ERVJfUkVWSUVXJyxcbiAgICBQZW5kaW5nRW5hYmxlbWVudCA9ICdQRU5ESU5HX0VOQUJMRU1FTlQnLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIERlbmllZCA9ICdERU5JRUQnXG59XG5cbi8qKlxuICogVGhlIHRlY2huaWNhbCBjb250YWN0IGZvciB0aGUgZW5kIGN1c3RvbWVyLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyB0ZWNobmljYWwgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lciwgaW5jbHVkaW5nIHNlY3JldHMgZm9yIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZlxuICAgICAqL1xuICAgIHNlY3JldHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IFBhcnR5SW5kaXZpZHVhbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnR5SW5kaXZpZHVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5SW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eUluZGl2aWR1YWxcbiAgICAgKi9cbiAgICBOQU1FOiBJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5BIHZhbHVlIGZyb20gYSBNSVNNTyBkZWZpbmVkIGxpc3QgdGhhdCBpZGVudGlmaWVzIHRoZSByb2xlIHRoYXQgdGhlIHBhcnR5IHBsYXlzIGluIHRoZSB0cmFuc2FjdGlvbi4gUGFydGllcyBtYXkgYmUgZWl0aGVyIGEgcGVyc29uIG9yIGxlZ2FsIGVudGl0eS4gQSBwYXJ0eSBtYXkgcGxheSBtdWx0aXBsZSByb2xlcyBpbiBhIHRyYW5zYWN0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydHlSb2xlVHlwZSB7XG4gICAgQm9ycm93ZXIgPSAnQm9ycm93ZXInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIG1vbmV0YXJ5IGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5IHtcbiAgICAvKipcbiAgICAgKiBBIG51bWVyaWNhbCBhbW91bnQgb2YgYSBzcGVjaWZpYyBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbmN5IGNvZGUsIGUuZy4gVVNEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlGcmVxdWVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlGcmVxdWVuY3kge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlGcmVxdWVuY3lWYWx1ZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5RnJlcXVlbmN5XG4gICAgICovXG4gICAgdmFsdWU6IFBheUZyZXF1ZW5jeVZhbHVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheUZyZXF1ZW5jeVZhbHVlIHtcbiAgICBNb250aGx5ID0gJ21vbnRobHknLFxuICAgIFNlbWltb250aGx5ID0gJ3NlbWltb250aGx5JyxcbiAgICBXZWVrbHkgPSAnd2Vla2x5JyxcbiAgICBCaXdlZWtseSA9ICdiaXdlZWtseScsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheWNoZWNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBjaGVja19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZGlzdHJpYnV0aW9uX2JyZWFrZG93bj86IEFycmF5PERpc3RyaWJ1dGlvbkJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2QgZW5kIGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheV9kYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIHN0YXJ0IGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHtcbiAgICBQYXlGcmVxdWVuY3lVbmtub3duID0gJ1BBWV9GUkVRVUVOQ1lfVU5LTk9XTicsXG4gICAgUGF5RnJlcXVlbmN5V2Vla2x5ID0gJ1BBWV9GUkVRVUVOQ1lfV0VFS0xZJyxcbiAgICBQYXlGcmVxdWVuY3lCaXdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX0JJV0VFS0xZJyxcbiAgICBQYXlGcmVxdWVuY3lTZW1pbW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX1NFTUlNT05USExZJyxcbiAgICBQYXlGcmVxdWVuY3lNb250aGx5ID0gJ1BBWV9GUkVRVUVOQ1lfTU9OVEhMWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG90YWwgZGVkdWN0aW9ucyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGFjY291bnQgZm9yIHRoZSBnaXZlbiBkaXN0cmlidXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayB0aGF0IHRoZSBwYXltZW50IGlzIGJlaW5nIGRlcG9zaXRlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgZGlzdHJpYnV0ZWQgdG8gdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB0aGUgcGF5c3R1YiB3YXMgc2VudCB0byAoZS5nLiBcXCdjaGVja2luZ1xcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIENvbW1vbmx5IHVzZWQgdGVybSB0byBkZXNjcmliZSB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiBob3VycyB3b3JrZWQgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YlBheVBlcmlvZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheWNoZWNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZGlzdHJpYnV0aW9uX2JyZWFrZG93bjogQXJyYXk8UGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheSBwZXJpb2QgZW5kZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheSBzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfYmFzaXM/OiBDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIHN0YXJ0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YlRheHBheWVySUQge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfbWFzazogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50XG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC4gTWluaW11bSBhY2NlcHRlZCB2YWx1ZSBpcyBgMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwYXltZW50LiBGb3Igc3RhbmRpbmcgb3JkZXJzIGFuZCBwYXltZW50IGNvbnNlbnRzLCBgXFxcIkdCUFxcXCJgIG11c3QgYmUgdXNlZC4gRm9yIFBvbGFuZCwgRGVubWFyaywgU3dlZGVuIGFuZCBOb3J3YXksIG9ubHkgdGhlIGxvY2FsIGN1cnJlbmN5IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50QW1vdW50Q3VycmVuY3kge1xuICAgIEdicCA9ICdHQlAnLFxuICAgIEV1ciA9ICdFVVInLFxuICAgIFBsbiA9ICdQTE4nLFxuICAgIFNlayA9ICdTRUsnLFxuICAgIERrayA9ICdES0snLFxuICAgIE5vayA9ICdOT0snXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50TnVsbGFibGVcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRDaGFubmVsIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGFtb3VudCBvZiBhIHNpbmdsZSBwYXltZW50IGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFdoZXJlIHRoZSBwYXltZW50IGNvbnNlbnQgcGVyaW9kIHNob3VsZCBzdGFydC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHBlcmlvZGljIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsIHtcbiAgICBEYXkgPSAnREFZJyxcbiAgICBXZWVrID0gJ1dFRUsnLFxuICAgIE1vbnRoID0gJ01PTlRIJyxcbiAgICBZZWFyID0gJ1lFQVInXG59XG5cbi8qKlxuICogTGlmZSBzcGFuIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBBZnRlciB0aGUgYHRvYCBkYXRlIHRoZSBwYXltZW50IGNvbnNlbnQgZXhwaXJlcyBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGZvciBwYXltZW50IGluaXRpYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IGNvbnNlbnQgc2NvcGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHNjb3BlczogQXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xufVxuLyoqXG4gKiBMaW1pdGF0aW9ucyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBwYXltZW50cyBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50VmFsaWREYXRlVGltZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICB2YWxpZF9kYXRlX3RpbWU/OiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgbWF4X3BheW1lbnRfYW1vdW50OiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFtb3VudCBsaW1pdGF0aW9ucyBwZXIgcGVyaW9kIG9mIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIHBlcmlvZGljX2Ftb3VudHM6IEFycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+O1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci4gVGhlIGNyZWF0ZWQgY29uc2VudCBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciBmdW5kcyB0byB0aGlzIHJlY2lwaWVudCBvbmx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCBjb25zZW50IHNjb3Blcy5cbiAgICAgKiBAdHlwZSB7U2V0PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlczogU2V0PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBjb25zZW50IHBheW1lbnQuIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgY29uc2VudCBwYXltZW50IGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHBheW1lbnQgaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgcGF5bWVudCB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHNjb3BlLiBEZWZpbmVzIHBvc3NpYmxlIGRpcmVjdGlvbnMgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBNRV9UT19NRWA6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYEVYVEVSTkFMYDogQWxsb3dzIGluaXRpYXRpbmcgcGF5bWVudHMgZnJvbSB0aGUgdXNlclxcJ3MgYWNjb3VudCB0byB0aGlyZCBwYXJ0aWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUge1xuICAgIE1lVG9NZSA9ICdNRV9UT19NRScsXG4gICAgRXh0ZXJuYWwgPSAnRVhURVJOQUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudCBjb25zZW50LiAgYFVOQVVUSE9SSVNFRGA6IENvbnNlbnQgY3JlYXRlZCwgYnV0IHJlcXVpcmVzIHVzZXIgYXV0aG9yaXNhdGlvbi4gIGBSRUpFQ1RFRGA6IENvbnNlbnQgYXV0aG9yaXNhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYW5kL29yIHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIHdoYXQgc3BlY2lmaWMgcGF5bWVudCBjb25maWd1cmF0aW9ucyBhbiBpbnN0aXR1dGlvbiBzdXBwb3J0cyB3aGVuIG1ha2luZyBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudHMgZnJvbSBhIGRpZmZlcmVudCBjb3VudHJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfaW50ZXJuYXRpb25hbF9wYXltZW50czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgU0VQQSBJbnN0YW50IHBheW1lbnRzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc2VwYV9pbnN0YW50OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbWFwcGluZyBvZiBjdXJyZW5jeSB0byBtYXhpbXVtIHBheW1lbnQgYW1vdW50IChkZW5vbWluYXRlZCBpbiB0aGUgc21hbGxlc3QgdW5pdCBvZiBjdXJyZW5jeSkgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIEV4YW1wbGU6IGB7XFxcIkdCUFxcXCI6IFxcXCIxMDAwMFxcXCJ9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhpbXVtX3BheW1lbnRfYW1vdW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcmV0dXJuaW5nIHJlZnVuZCBkZXRhaWxzIHdoZW4gaW5pdGlhdGluZyBhIHBheW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19yZWZ1bmRfZGV0YWlsczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFuZGluZ19vcmRlcl9tZXRhZGF0YTogUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdXNlZCB0byByZXN0cmljdCB0aGUgYWNjb3VudHMgdXNlZCBmb3IgcGF5bWVudHMuIElmIHByb3ZpZGVkLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmVmdW5kIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgKHNpbmNlIG5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhlbSkuIEluIG9yZGVyIHRvIHRyYWNrIHNldHRsZW1lbnQgdmlhIFBheW1lbnQgQ29uZmlybWF0aW9uLCBlYWNoIHBheW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIHJlZmVyZW5jZS4gSWYgdGhlIHJlZmVyZW5jZSBwcm92aWRlZCB0aHJvdWdoIHRoZSBBUEkgaXMgbm90IHVuaXF1ZSwgUGxhaWQgd2lsbCBhZGp1c3QgaXQuIFNvbWUgaW5zdGl0dXRpb25zIG1heSBsaW1pdCB0aGUgcmVmZXJlbmNlIHRvIGxlc3MgdGhhbiAxOCBjaGFyYWN0ZXJzLiBJZiBuZWNlc3NhcnksIFBsYWlkIHdpbGwgYWRqdXN0IHRoZSByZWZlcmVuY2UgYnkgdHJ1bmNhdGluZyBpdCB0byBmaXQgdGhlIGluc3RpdHV0aW9uXFwncyByZXF1aXJlbWVudHMuIEJvdGggdGhlIG9yaWdpbmFsbHkgcHJvdmlkZWQgYW5kIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgcmVmZXJlbmNlcyAoaWYgYW55KSBjYW4gYmUgZm91bmQgaW4gdGhlIGByZWZlcmVuY2VgIGFuZCBgYWRqdXN0ZWRfcmVmZXJlbmNlYCBmaWVsZHMsIHJlc3BlY3RpdmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGb3IgYSBwYXltZW50IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQsIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIHZhbHVlOiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoZSBpbml0aWFsIHBoYXNlIG9mIHRoZSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVTdGF0dXMge1xuICAgIFBheW1lbnRTdGF0dXNJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcGF5bWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgcGF5bWVudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9kZXRhaWxzPzogRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbmRlckJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRSZWZ1bmRlZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGF5bWVudHMgdG8gcmV0dXJuLiBJZiBgY291bnRgIGlzIG5vdCBzcGVjaWZpZWQsIGEgbWF4aW11bSBvZiAxMCBwYXltZW50cyB3aWxsIGJlIHJldHVybmVkLCBiZWdpbm5pbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgcGF5bWVudCBiZWZvcmUgdGhlIGN1cnNvciAoaWYgc3BlY2lmaWVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gXFxcIjIwMTktMTItMDZUMjI6MzU6NDlaXFxcIikuIE9ubHkgcGF5bWVudHMgY3JlYXRlZCBiZWZvcmUgdGhlIGN1cnNvciB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC4gSWYgc3BlY2lmaWVkLCBvbmx5IHBheW1lbnRzLCBleGVjdXRlZCB1c2luZyB0aGlzIGNvbnNlbnQsIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSB0aGF0LCB3aGVuIHVzZWQgYXMgdGhlIG9wdGlvbmFsIGBjdXJzb3JgIHBhcmFtZXRlciB0byBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgLCB3aWxsIHJldHVybiB0aGUgbmV4dCB1bnJldHVybmVkIHBheW1lbnQgYXMgaXRzIGZpcnN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvcmV2ZXJzZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50IHRvIHJldmVyc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHJlZnVuZC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFRvUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IFBheW1lbnRBbW91bnRUb1JlZnVuZDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZnVuZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIHBheW1lbnRzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF5bWVudCBpcyB3YWl0aW5nIG9uIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gQSBwYXltZW50IG1heSByZS1lbnRlciB0aGlzIHN0YXRlIGxhdGVyIG9uIGlmIGZ1cnRoZXIgaW5wdXQgaXMgbmVlZGVkLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRob3Jpc2VkIGFuZCBhY2NlcHRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3Igc3VjY2Vzc2Z1bCBwYXltZW50cywgdGhpcyBpcyBhIHBvdGVudGlhbCB0ZXJtaW5hbCBzdGF0dXMuIEZ1cnRoZXIgc3RhdHVzIHRyYW5zaXRpb25zIGNhbiBiZSB0byBSRUpFQ1RFRCBhbmQsIHdoZW4gc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgdG8gRVhFQ1VURUQuICBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFBBWU1FTlRfU1RBVFVTX0ZBSUxFRGA6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgdG8gYmUgaW5pdGlhdGVkLiBUaGlzIGVycm9yIG1heSBiZSBjYXVzZWQgYnkgdHJhbnNpZW50IHN5c3RlbSBvdXRhZ2VzIGFuZCBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZCBieSBQbGFpZC4gVGhpcyBjYW4gb2NjdXIsIGZvciBleGFtcGxlLCBkdWUgdG8gUGxhaWQgZmxhZ2dpbmcgdGhlIHBheW1lbnQgYXMgcG90ZW50aWFsbHkgcmlza3kuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBoYXMgYXV0aG9yaXNlZCB0aGUgdHJhbnNhY3Rpb24uICBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYDogVGhlIHBheW1lbnQgd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBlbmQgdXNlcikgZHVyaW5nIGF1dGhvcmlzYXRpb24uICBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgOiBUaGUgZnVuZHMgaGF2ZSBzdWNjZXNzZnVsbHkgbGVmdCB0aGUgcGF5ZXIgYWNjb3VudCBhbmQgcGF5bWVudCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBzdXBwb3J0IHRoaXMgc3RhdHVzOiBzdXBwb3J0IGlzIG1vcmUgY29tbW9uIGluIHRoZSBVSywgYW5kIGxlc3MgY29tbW9uIGluIHRoZSBFVS4gRm9yIGluc3RpdHV0aW9ucyB3aGVyZSB0aGlzIHN0YXR1cyBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgdGVybWluYWwgc3RhdHVzIGZvciBhIHN1Y2Nlc3NmdWwgcGF5bWVudCB3aWxsIGJlIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgLiAgYFBBWU1FTlRfU1RBVFVTX1NFVFRMRURgOiBUaGUgcGF5bWVudCBoYXMgc2V0dGxlZCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBBIHBheW1lbnQgd2lsbCB0eXBpY2FsbHkgc2V0dGxlIHdpdGhpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHdoaWNoIHBheW1lbnQgcmFpbCBpcyB1c2VkLiBUaGlzIHN0YXR1cyBpcyBvbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgdXNpbmcgW1BsYWlkIFZpcnR1YWwgQWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdmlydHVhbC1hY2NvdW50cy8pLiAgYFBBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGA6IFRoZSBwYXltZW50IHdhcyByZWplY3RlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRGVwcmVjYXRlZDogVGhlc2Ugc3RhdHVzZXMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLiAgYFBBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTicsXG4gICAgRXhlY3V0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVhFQ1VURUQnLFxuICAgIFNldHRsZWQgPSAnUEFZTUVOVF9TVEFUVVNfU0VUVExFRCcsXG4gICAgQXV0aG9yaXNpbmcgPSAnUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkcnLFxuICAgIENhbmNlbGxlZCA9ICdQQVlNRU5UX1NUQVRVU19DQU5DRUxMRUQnLFxuICAgIEVzdGFibGlzaGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEJyxcbiAgICBSZWplY3RlZCA9ICdQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHBheW1lbnRfdG9rZW5gIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgdGhlIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgdG9rZW4gd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgcGF5bWVudF90b2tlbmAgZXhwaXJlcyBhZnRlciAxNSBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHJlY2lwaWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdlIHJlY29tbWVuZCB1c2luZyBzdHJpbmdzIG9mIGxlbmd0aCAxOCBvciBsZXNzIGFuZCBhdm9pZCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC4gSWYgQkFDUyBkYXRhIGlzIG5vdCBwcm92aWRlZCwgYW4gSUJBTiBpcyByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IHJlY2lwaWVudHMgY3JlYXRlZCBmb3IgUGF5bWVudCBJbml0aWF0aW9uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB2YWxpZCBQYXltZW50IEluaXRpYXRpb24gc3RhbmRpbmcgb3JkZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIGNsb3NlZC1lbmRlZCBzdGFuZGluZyBvcmRlcnMgYnkgcHJvdmlkaW5nIGFuIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX2VuZF9kYXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGBNT05USExZYCBzdGFuZGluZyBvcmRlcnMuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBuZWdhdGl2ZSBpbnRlZ2VycyAoLTEgdG8gLTUpIGZvciBzZXR0aW5nIHVwIGEgYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX25lZ2F0aXZlX2V4ZWN1dGlvbl9kYXlzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgdmFsaWQgc3RhbmRpbmcgb3JkZXIgaW50ZXJ2YWxzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICB2YWxpZF9zdGFuZGluZ19vcmRlcl9pbnRlcnZhbHM6IEFycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gaW50ZXItYmFuayB0cmFuc2ZlcnMuIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgbm90IGFuIGludGVyLWJhbmsgdHJhbnNmZXIsIGFsbCBmaWVsZHMgd2lsbCBiZSBgbnVsbGAuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoZSBgcGF5bWVudF9tZXRhYCBrZXkgd2lsbCBhbHdheXMgYXBwZWFyLCBidXQgbm8gZGF0YSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudE1ldGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50TWV0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSBudW1iZXIgc3VwcGxpZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBwZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyByZWNlaXZpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnR5IGluaXRpYXRpbmcgYSB3aXJlIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgd2lyZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2ZlciwgZS5nLiBcXCdBQ0hcXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXltZW50IHByb2Nlc3NvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgdXBkYXRlZCBhdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyBjcmVhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGRlbGV0ZWQgYXQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIFBheW1lbnQgUHJvZmlsZSBoYXMgbm90IGJlZW4gZGVsZXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50UHJvZmlsZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudFByb2ZpbGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUuICBgUkVBRFlgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyByZWFkeSB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC4gIGBQRU5ESU5HYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaXMgbm90IHJlYWR5IHRvIGJlIHVzZWQuIFlvdeKAmWxsIG5lZWQgdG8gY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkIHRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZS4gIGBSRU1PVkVEYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRQcm9maWxlU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFJlYWR5ID0gJ1JFQURZJyxcbiAgICBSZW1vdmVkID0gJ1JFTU9WRUQnXG59XG5cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBpbnRlcnZhbCBvZiB0aGUgcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlZHVsZUludGVydmFsIHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknXG59XG5cbi8qKlxuICogUGF5bWVudCBzY2hlbWUuIElmIG5vdCBzcGVjaWZpZWQgLSB0aGUgZGVmYXVsdCBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgdXNlZCAoZS5nLiBgU0VQQV9DUkVESVRfVFJBTlNGRVJgIGZvciBFVSkuIFVzaW5nIHVuc3VwcG9ydGVkIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBhIGZhaWxlZCBwYXltZW50LiAgYExPQ0FMX0RFRkFVTFRgOiBUaGUgZGVmYXVsdCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkLiAgYExPQ0FMX0lOU1RBTlRgOiBUaGUgaW5zdGFudCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkIChpZiBhcHBsaWNhYmxlKS4gRmVlcyBtYXkgYmUgYXBwbGllZCBieSB0aGUgaW5zdGl0dXRpb24uIElmIHRoZSBtYXJrZXQgZG9lcyBub3Qgc3VwcG9ydCBhbiBJbnN0YW50IFNjaGVtZSAoZS5nLiBEZW5tYXJrKSwgdGhlIGRlZmF1bHQgaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHVzZWQuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlRgOiBJbnN0YW50IHBheW1lbnQgd2l0aGluIHRoZSBTRVBBIGFyZWEuIE1heSBpbnZvbHZlIGFkZGl0aW9uYWwgZmVlcyBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgYXQgc29tZSBiYW5rcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlbWUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgTG9jYWxEZWZhdWx0ID0gJ0xPQ0FMX0RFRkFVTFQnLFxuICAgIExvY2FsSW5zdGFudCA9ICdMT0NBTF9JTlNUQU5UJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXIgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVInLFxuICAgIFNlcGFDcmVkaXRUcmFuc2Zlckluc3RhbnQgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgZm9yIHRoZSBwYXltZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugd2hlbiBjcmVhdGluZyB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3JlZmVyZW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYHN0YXJ0X2RhdGVgIHByb3ZpZGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGluZyBvcmRlci4gSWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIG9yIGlmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3VudCBsZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGEge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEluY29tZVJhdGVPZlBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcmF0ZV9vZl9wYXk6IFBheXJvbGxJbmNvbWVSYXRlT2ZQYXk7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBwYXlyb2xsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheSBzdHVicyBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFBheVN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgcGF5X3N0dWJzOiBBcnJheTxDcmVkaXRQYXlTdHViPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSBXLTJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRXMj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICB3MnM6IEFycmF5PENyZWRpdFcyPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSAxMDk5cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0MTA5OT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBmb3JtMTA5OXM6IEFycmF5PENyZWRpdDEwOTk+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYXRlIGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXkge1xuICAgIC8qKlxuICAgICAqIFRoZSByYXRlIGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9yYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF5cm9sbCBpdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lOiBBcnJheTxQYXlyb2xsSW5jb21lT2JqZWN0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEl0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXlyb2xsSXRlbVN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBJdGVtIHdhcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgdGhlIHByb2Nlc3Npbmcgc3RhdHVzIGZvciB0aGUgdmVyaWZpY2F0aW9uLiAgYFVOS05PV05gOiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgYW5kIHRoZSB1c2VyIGhhcyBhcHByb3ZlZCBmb3Igc2hhcmluZy4gVGhlIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlIHJldHJpZXZlZC4gIGBQUk9DRVNTSU5HYDogVGhlIHZlcmlmaWNhdGlvbiBpcyBzdGlsbCBwcm9jZXNzaW5nLiBUaGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHlldC4gIGBGQUlMRURgOiBUaGUgcHJvY2Vzc2luZyBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiAgYEFQUFJPVkFMX1NUQVRVU19QRU5ESU5HYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBidXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgYXBwcm92ZWQgdGhlIHNoYXJpbmcgb2YgdGhlIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBwcm9jZXNzaW5nX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBJdGVtIGxpbmtlZCBhcyBwYXJ0IG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsUmlza1NpZ25hbHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGluY29tZSBkb2N1bWVudCBhdXRoZW50aWNpdHkgZGF0YSByZXRyaWV2ZWQgZm9yIGVhY2ggb2YgdGhlIHVzZXJcXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIGVuZCB1c2VyXFwncyBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkb2NfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50RGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1wbG95bWVudF9kZXRhaWxzPzogRW1wbG95bWVudERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IE5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5UGVyaW9kRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheXN0dWJfZGV0YWlscz86IFBheXN0dWJEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YllURERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9lYXJuaW5ncz86IFBheXN0dWJZVEREZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUxPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0ZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVkdWN0aW9uIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGVkdWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiwgYXMgcHJvdmlkZWQgb24gdGhlIHBheXN0dWIuIEZvciBleGFtcGxlOiBgXFxcIjQwMShrKVxcXCJgLCBgXFxcIkZJQ0EgTUVEIFRBWFxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVkdWN0aW9uIGlzIHByZS10YXg7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgaXNfcHJldGF4OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRldGFpbHMgdGhhdCBjYW4gYmUgZm91bmQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIEJlZ2lubmluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2Rfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9lbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGF5IGRhdGUgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgZ2VuZXJhdGVkIHRoZSBwYXlzdHViLCBlLmcuIEFEUFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5c3R1Yl9wcm92aWRlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheXN0dWJQYXlGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkYXRhIGZyb20gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVlPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM/OiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGVtcGxveWVlIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzcztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheWNoZWNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBjaGVja19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZGlzdHJpYnV0aW9uX2JyZWFrZG93bj86IEFycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2QgZW5kIGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheV9kYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIHN0YXJ0IGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZW1wbG95ZWUgaXMgcGFpZC4gUG9zc2libGUgdmFsdWVzOiBgTU9OVEhMWWAsIGBCSS1XRUVLTFlgLCBgV0VFS0xZYCwgYFNFTUktTU9OVEhMWWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlzdHViUGF5RnJlcXVlbmN5IHtcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEJpV2Vla2x5ID0gJ0JJLVdFRUtMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSS1NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBvZiBpbmNvbWUgZWFybmVkIHllYXIgdG8gZGF0ZSwgYXMgYmFzZWQgb24gcGF5c3R1YiBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgZ3Jvc3MgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIG5ldCAodGFrZSBob21lKSBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIG5ldF9lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbeKAmXMgYWNjZXNzIGNvbnNlbnQgaXMgZXhwaXJpbmcgaW4gNyBkYXlzLiBTb21lIEl0ZW1zIGhhdmUgZXhwbGljaXQgZXhwaXJhdGlvbiB0aW1lcyBhbmQgd2UgdHJ5IHRvIHJlbGF5IHRoaXMgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2Ugc2VydmljZSBkaXNydXB0aW9uLiBUaGlzIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19FWFBJUkFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIHBlcnNvbmFsIGZpbmFuY2UgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgQ1NWIGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0byBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgZnJvbSB0aGUgbGVnYWN5IGNhdGVnb3JpZXMsIGFsc28gcmVmZXIgdG8gdGhlIFtgbWlncmF0aW9uIGd1aWRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjYXRlZ29yaWVzIGFjY3VyYXRlbHkgZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uIGludGVudC4gIGBWRVJZX0hJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTE9XYDogVGhpcyBjYXRlZ29yeSBtYXkgcmVmbGVjdCB0aGUgaW50ZW50LCBidXQgdGhlcmUgbWF5IGJlIG90aGVyIGNhdGVnb3JpZXMgdGhhdCBhcmUgbW9yZSBhY2N1cmF0ZS4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBwaG9uZSBudW1iZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgcGhvbmUgbnVtYmVyIGFzIHRoZSBwcmltYXJ5IG51bWJlciBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVOdW1iZXJUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQaG9uZU51bWJlclR5cGVFbnVtIHtcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIFdvcmsgPSAnd29yaycsXG4gICAgT2ZmaWNlID0gJ29mZmljZScsXG4gICAgTW9iaWxlID0gJ21vYmlsZScsXG4gICAgTW9iaWxlMSA9ICdtb2JpbGUxJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBwaG9uZSBudW1iZXIgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBwaG9uZSBudW1iZXIgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBwaG9uZSBudW1iZXIuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCAobWF0Y2hpbmcgdGhlIHNhbWUgcGhvbmUgbnVtYmVyIHdpdGggZXh0ZW5zaW9uIGFnYWluc3Qgb25lIHdpdGhvdXQgZXh0ZW5zaW9uLCBldGMuKSwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIHBob25lIG51bWJlciBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHBob25lIG51bWJlciBpcyBhIHBob25lIGxpbmUgb3IgYSBmYXggbGluZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBob25lVHlwZSB7XG4gICAgUGhvbmUgPSAncGhvbmUnLFxuICAgIEZheCA9ICdmYXgnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgZGV0ZWN0ZWQgaW4gdGhlIGltYWdlcyBwcm92aWRlZC4gV2lsbCBhbHdheXMgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICBgZHJpdmVyc19saWNlbnNlYCAtIEEgZHJpdmVyXFwncyBsaWNlbnNlIGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5LCBlc3RhYmxpc2hpbmcgaWRlbnRpdHkgd2l0aG91dCBhbnkgZ3VhcmFudGVlIGFzIHRvIGNpdGl6ZW5zaGlwLCBhbmQgZ3JhbnRpbmcgZHJpdmluZyBwcml2aWxlZ2VzICAgIGBpZF9jYXJkYCAtIEEgZ2VuZXJhbCBuYXRpb25hbCBpZGVudGlmaWNhdGlvbiBjYXJkLCBkaXN0aW5jdCBmcm9tIGRyaXZlclxcJ3MgbGljZW5zZXMgYXMgaXQgb25seSBlc3RhYmxpc2hlcyBpZGVudGl0eSAgICBgcGFzc3BvcnRgIC0gQSB0cmF2ZWwgcGFzc3BvcnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgZm9yIG9uZSBvZiBpdHMgY2l0aXplbnMgICAgYHJlc2lkZW5jZV9wZXJtaXRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT50ZW1wb3JhcmlseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgcmVzaWRlbnRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT5wZXJtYW5lbnRseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgdmlzYWAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIGVudHJ5IGZvciBhIHNob3J0IGR1cmF0aW9uIGFuZCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlLCB0eXBpY2FsbHkgbm8gbG9uZ2VyIHRoYW4gNiBtb250aHMgIE5vdGU6IFRoaXMgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBJRCB0eXBlIHRoYXQgdGhlIHVzZXIgc2VsZWN0cyB3aXRoaW4gTGluay4gRm9yIGV4YW1wbGUsIGlmIHRoZXkgc2VsZWN0IFxcXCJEcml2ZXJcXCdzIExpY2Vuc2VcXFwiIGJ1dCB0aGVuIHN1Ym1pdCBhIHBpY3R1cmUgb2YgYSBwYXNzcG9ydCwgdGhpcyBmaWVsZCB3aWxsIHNheSBgcGFzc3BvcnRgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnkge1xuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSWRDYXJkID0gJ2lkX2NhcmQnLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBSZXNpZGVuY2VQZXJtaXRDYXJkID0gJ3Jlc2lkZW5jZV9wZXJtaXRfY2FyZCcsXG4gICAgUmVzaWRlbnRDYXJkID0gJ3Jlc2lkZW50X2NhcmQnLFxuICAgIFZpc2EgPSAndmlzYSdcbn1cblxuLyoqXG4gKiBEYXRhIGV4dHJhY3RlZCBmcm9tIGEgdXNlci1zdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEge1xuICAgIC8qKlxuICAgICAqIEFscGhhLW51bWVyaWMgSUQgbnVtYmVyIGV4dHJhY3RlZCB2aWEgT0NSIGZyb20gdGhlIHVzZXJcXCdzIGRvY3VtZW50IGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19yZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnROYW1lTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogRG9jdW1lbnROYW1lTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwaXJhdGlvbkRhdGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IEV4cGlyYXRpb25EYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1aW5nQ291bnRyeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogSXNzdWluZ0NvdW50cnk7XG59XG4vKipcbiAqIFVSTHMgZm9yIGRvd25sb2FkaW5nIG9yaWdpbmFsIGFuZCBjcm9wcGVkIGltYWdlcyBmb3IgdGhpcyBkb2N1bWVudCBzdWJtaXNzaW9uLiBUaGUgVVJMcyBhcmUgZGVzaWduZWQgdG8gb25seSBhbGxvdyBkb3dubG9hZGluZywgbm90IGhvdCBsaW5raW5nLCBzbyB0aGUgVVJMIHdpbGwgb25seSBzZXJ2ZSB0aGUgZG9jdW1lbnQgaW1hZ2UgZm9yIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyaW5nLiBUaGUgZXhwaXJhdGlvbiB0aW1lIGlzIDYwIHNlY29uZHMgYWZ0ZXIgdGhlIGBHRVRgIHJlcXVlc3QgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiBBIG5ldyBleHBpcmluZyBVUkwgaXMgZ2VuZXJhdGVkIHdpdGggZWFjaCByZXF1ZXN0LCBzbyB5b3UgY2FuIGFsd2F5cyByZXJlcXVlc3QgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlmIG9uZSBvZiB5b3VyIFVSTHMgZXhwaXJlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXMge1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSB1bmNyb3BwZWQgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcCBvZiBqdXN0IHRoZSB1c2VyXFwncyBmYWNlIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLiBNaWdodCBiZSBudWxsIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGEgZmFjZSBwaG90by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgZmFjZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gQW4gSXRlbSB3aXRoIGEgbm9uLWBudWxsYCBlcnJvciBvYmplY3Qgd2lsbCBvbmx5IGJlIHBhcnQgb2YgYW4gQVBJIHJlc3BvbnNlIHdoZW4gY2FsbGluZyBgL2l0ZW0vZ2V0YCB0byB2aWV3IEl0ZW0gc3RhdHVzLiBPdGhlcndpc2UsIGVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQ7IGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgYW4gZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBsYWlkRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFpZEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBQbGFpZEVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCwgdG8gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLiBUaGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZCBpbiBlcnJvcnMgcHJvdmlkZWQgYnkgd2ViaG9va3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIEFzc2V0cyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgUGxhaWQgZG9jdW1lbnRhdGlvbiBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBsYWlkRXJyb3JUeXBlIHtcbiAgICBJbnZhbGlkUmVxdWVzdCA9ICdJTlZBTElEX1JFUVVFU1QnLFxuICAgIEludmFsaWRSZXN1bHQgPSAnSU5WQUxJRF9SRVNVTFQnLFxuICAgIEludmFsaWRJbnB1dCA9ICdJTlZBTElEX0lOUFVUJyxcbiAgICBJbnN0aXR1dGlvbkVycm9yID0gJ0lOU1RJVFVUSU9OX0VSUk9SJyxcbiAgICBSYXRlTGltaXRFeGNlZWRlZCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICBBcGlFcnJvciA9ICdBUElfRVJST1InLFxuICAgIEl0ZW1FcnJvciA9ICdJVEVNX0VSUk9SJyxcbiAgICBBc3NldFJlcG9ydEVycm9yID0gJ0FTU0VUX1JFUE9SVF9FUlJPUicsXG4gICAgUmVjYXB0Y2hhRXJyb3IgPSAnUkVDQVBUQ0hBX0VSUk9SJyxcbiAgICBPYXV0aEVycm9yID0gJ09BVVRIX0VSUk9SJyxcbiAgICBQYXltZW50RXJyb3IgPSAnUEFZTUVOVF9FUlJPUicsXG4gICAgQmFua1RyYW5zZmVyRXJyb3IgPSAnQkFOS19UUkFOU0ZFUl9FUlJPUicsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uRXJyb3IgPSAnSU5DT01FX1ZFUklGSUNBVElPTl9FUlJPUicsXG4gICAgTWljcm9kZXBvc2l0c0Vycm9yID0gJ01JQ1JPREVQT1NJVFNfRVJST1InXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBzZXQgb2YgaWRzIHJlbGF0ZWQgdG8gYW4gZW1wbG95ZWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IOKAkyBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBJZiBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkgaXMgZW5hYmxlZCwgdGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpYWJpbGl0aWVzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXM6IExpYWJpbGl0aWVzT2JqZWN0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSB0aGUgYGFjY291bnRgIGZvciB3aGljaCBhdXRoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCBhIG51bGwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0FDSE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBhY2g/OiBOdW1iZXJzQUNITnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzRUZUTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGVmdD86IE51bWJlcnNFRlROdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0JBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYmFjcz86IE51bWJlcnNCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4gIFRoaXMgZmllbGQgbXVzdCBiZSByZXR1cm5lZCBhcyBhIGJvb2xlYW4uIElmIGZvcm1hdHRlZCBpbmNvcnJlY3RseSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBbYElOVkFMSURfRklFTERgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5pdGlhdGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGRheXMgKGhvbGQgdGltZSkgc2luY2UgdGhlIEFDSCBkZWJpdCB0cmFuc2FjdGlvbiB0aGF0IHlvdSB3YWl0IGJlZm9yZSBtYWtpbmcgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzLiBUaGUgaG9sZGluZyB0aW1lIGNvdWxkIGFmZmVjdCB0aGUgQUNIIHJldHVybiByYXRlLiAgRm9yIGV4YW1wbGUsIHVzZSAwIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycyBpbnN0YW50bHkgb3IgdGhlIHNhbWUgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24sIG9yIDEgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRoZSBuZXh0IGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfZnVuZHNfb25faG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERlY2lzaW9uT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVjaXNpb25fb3V0Y29tZT86IFNpZ25hbERlY2lzaW9uT3V0Y29tZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFBheW1lbnRNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kPzogU2lnbmFsUGF5bWVudE1ldGhvZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCAoaW4gVVNEKSBtYWRlIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycyBpbnN0YW50bHkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbi4gSXQgY291bGQgYmUgYSBwYXJ0aWFsIGFtb3VudCBvZiB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9uIChleGFtcGxlOiAxMDIuMDUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudF9pbnN0YW50bHlfYXZhaWxhYmxlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIElEL2lkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZW5kIHVzZXIgaXMgcHJlc2VudCB3aGlsZSBpbml0aWF0aW5nIHRoZSBBQ0ggdHJhbnNmZXIgYW5kIHRoZSBlbmRwb2ludCBpcyBiZWluZyBjYWxsZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgQUNIIHRyYW5zZmVyIGlzIHNjaGVkdWxlZCBhbmQgdGhlIGVuZCB1c2VyIGlzIG5vdCBwcmVzZW50LCBvciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHRoZSBBQ0ggdHJhbnNmZXIgYnV0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBOYWNoYSBmaWxlIGZvciBBQ0ggcHJvY2Vzc2luZykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgSXRlbXMuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogKip0cnVlKiogaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgKipmYWxzZSoqIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsU2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmVzOiBTaWduYWxTY29yZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByZXR1cm4gY29kZSAoZS5nLiBcXFwiUjAxXFxcIikgIElmIGZvcm1hdHRlZCBpbmNvcnJlY3RseSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBbYElOVkFMSURfRklFTERgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIHRyYW5zYWN0aW9ucyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgeW91IGFyZSBpbnRlZ3JhdGluZyB3aXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0UHJvY2Vzc29yRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtIHtcbiAgICBEd29sbGEgPSAnZHdvbGxhJyxcbiAgICBHYWxpbGVvID0gJ2dhbGlsZW8nLFxuICAgIE1vZGVyblRyZWFzdXJ5ID0gJ21vZGVybl90cmVhc3VyeScsXG4gICAgT2Nyb2x1cyA9ICdvY3JvbHVzJyxcbiAgICBQcmltZVRydXN0ID0gJ3ByaW1lX3RydXN0JyxcbiAgICBWZXN0YSA9ICd2ZXN0YScsXG4gICAgRHJpdmV3ZWFsdGggPSAnZHJpdmV3ZWFsdGgnLFxuICAgIFZvcGF5ID0gJ3ZvcGF5JyxcbiAgICBBY2hxID0gJ2FjaHEnLFxuICAgIENoZWNrID0gJ2NoZWNrJyxcbiAgICBDaGVja2Jvb2sgPSAnY2hlY2tib29rJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaWxhTW9uZXkgPSAnc2lsYV9tb25leScsXG4gICAgUml6ZSA9ICdyaXplJyxcbiAgICBTdmJBcGkgPSAnc3ZiX2FwaScsXG4gICAgVW5pdCA9ICd1bml0JyxcbiAgICBXeXJlID0gJ3d5cmUnLFxuICAgIExpdGhpYyA9ICdsaXRoaWMnLFxuICAgIEFscGFjYSA9ICdhbHBhY2EnLFxuICAgIEFzdHJhID0gJ2FzdHJhJyxcbiAgICBNb292ID0gJ21vb3YnLFxuICAgIFRyZWFzdXJ5UHJpbWUgPSAndHJlYXN1cnlfcHJpbWUnLFxuICAgIE1hcnFldGEgPSAnbWFycWV0YScsXG4gICAgQ2hlY2tvdXQgPSAnY2hlY2tvdXQnLFxuICAgIFNvbGlkID0gJ3NvbGlkJyxcbiAgICBIaWdobm90ZSA9ICdoaWdobm90ZScsXG4gICAgR2VtaW5pID0gJ2dlbWluaScsXG4gICAgQXBleENsZWFyaW5nID0gJ2FwZXhfY2xlYXJpbmcnLFxuICAgIEd1c3RvID0gJ2d1c3RvJyxcbiAgICBBZHllbiA9ICdhZHllbicsXG4gICAgQXRvbWljID0gJ2F0b21pYycsXG4gICAgSTJjID0gJ2kyYycsXG4gICAgV2VwYXkgPSAnd2VwYXknLFxuICAgIFJpc2tpZmllZCA9ICdyaXNraWZpZWQnLFxuICAgIFV0YiA9ICd1dGInLFxuICAgIEFkcFJvbGwgPSAnYWRwX3JvbGwnLFxuICAgIEZvcnRyZXNzVHJ1c3QgPSAnZm9ydHJlc3NfdHJ1c3QnLFxuICAgIEJvbmQgPSAnYm9uZCcsXG4gICAgQmFra3QgPSAnYmFra3QnLFxuICAgIFRlYWwgPSAndGVhbCcsXG4gICAgWmVyb0hhc2ggPSAnemVyb19oYXNoJyxcbiAgICBUYWJhUGF5ID0gJ3RhYmFfcGF5JyxcbiAgICBLbm90ID0gJ2tub3QnLFxuICAgIFNhcmRpbmUgPSAnc2FyZGluZScsXG4gICAgQWxsb3kgPSAnYWxsb3knXG59XG5cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWAgYW5kIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvY2Vzc29yX3Rva2VuYCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYnkgdGhlIFBsYWlkIHBhcnRuZXIgdG8gbWFrZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhhdCB0aGUgcHJvY2Vzc29yIGhhcyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgaW5jbHVkaW5nIGZ1dHVyZSBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3Qgd2lsbCBncmFudCBhY2Nlc3MgdG8gYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhIHByb2Nlc3NvciB1cGRhdGVzIHRoZSB3ZWJob29rIFVSTCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4gdmlhIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBgUFJPQ0VTU09SX1RPS0VOYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYSBwcm9jZXNzb3IgdG9rZW4sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciwgb3Igc3VibWl0IGEgW1N1cHBvcnQgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3Byb2R1Y3QtZnVuY3Rpb25hbGl0eSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gdHJhbnNhY3Rpb24ocykgZm9yIGFuIEl0ZW0gYXJlIGRlbGV0ZWQuIFRoZSBkZWxldGVkIHRyYW5zYWN0aW9uIElEcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdlYmhvb2sgcGF5bG9hZC4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIGRlbGV0ZWQgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgaXRlbS4gTm90ZTogVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIG9uIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS4gVGhlIGN1cnNvciBvYnRhaW5lZCBhZnRlciBhbGwgcGFnZXMgaGF2ZSBiZWVuIHB1bGxlZCAoaW5kaWNhdGVkIGJ5IGBoYXNfbW9yZWAgYmVpbmcgYGZhbHNlYCkgd2lsbCBiZSB2YWxpZCBmb3IgYXQgbGVhc3QgMSB5ZWFyLiBUaGlzIGN1cnNvciBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciBsYXRlciBjYWxscy4gSWYgdHJhbnNhY3Rpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcHJvZHVjdCBhY2Nlc3MgYmVpbmcgcmVxdWVzdGVkLiBVc2VkIHRvIG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGFjcm9zcyBhbGwgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBhbGwgcHJvZHVjdHMgYWxsb3dlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRoZSBJZGVudGl0eSBwcm9kdWN0IChuYW1lLCBlbWFpbCwgcGhvbmUsIGFkZHJlc3MpLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBhY2NvdW50IG51bWJlciBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRyYW5zYWN0aW9uIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfcm91dGluZ19udW1iZXJcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19yb3V0aW5nX251bWJlcj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3RheF9zdGF0ZW1lbnRzXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfdGF4X3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImN1c3RvbWVyc19wcm9maWxlc1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGN1c3RvbWVyc19wcm9maWxlcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgQXV0aC4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgYXV0aGAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBBdXRoZW50aWNhdGlvbiBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIElkZW50aXR5LiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBpZGVudGl0eWAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBJZGVudGl0eSBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cyBoZWFsdGggb2YgYSByZXF1ZXN0IHR5cGUuIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgTGlhYmlsaXRpZXMgcmVxdWVzdHMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBhbmQgSXRlbSBsb2dpbnMgZWFjaCBoYXZlIHRoZWlyIG93biBzdGF0dXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBgYnJlYWtkb3duYCBvYmplY3QsIHdoaWNoIHByb3ZpZGVzIG1vcmUgZ3JhbnVsYXIgaW5zdGl0dXRpb24gaGVhbHRoIGRhdGEuICBgSEVBTFRIWWA6IHRoZSBtYWpvcml0eSBvZiByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgREVHUkFERURgOiBvbmx5IHNvbWUgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERPV05gOiBhbGwgcmVxdWVzdHMgYXJlIGZhaWxpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdHRlZCB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3RhdHVzIGNoYW5nZSBmb3IgdGhlIGluc3RpdHV0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfY2hhbmdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXNCcmVha2Rvd259XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IFByb2R1Y3RTdGF0dXNCcmVha2Rvd247XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c1N0YXR1c0VudW0ge1xuICAgIEhlYWx0aHkgPSAnSEVBTFRIWScsXG4gICAgRGVncmFkZWQgPSAnREVHUkFERUQnLFxuICAgIERvd24gPSAnRE9XTidcbn1cblxuLyoqXG4gKiBBIGRldGFpbGVkIGJyZWFrZG93biBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIHBlcmZvcm1hbmNlIGZvciBhIHJlcXVlc3QgdHlwZS4gVGhlIHZhbHVlcyBmb3IgYHN1Y2Nlc3NgLCBgZXJyb3JfcGxhaWRgLCBhbmQgYGVycm9yX2luc3RpdHV0aW9uYCBzdW0gdG8gMS4gVGhlIHRpbWUgcmFuZ2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGJyZWFrZG93biBtYXkgcmFuZ2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgZmV3IG1pbnV0ZXMgdG8gdGhlIHBhc3Qgc2l4IGhvdXJzLiBJbiBnZW5lcmFsLCBzbWFsbGVyIGluc3RpdHV0aW9ucyB3aWxsIHNob3cgc3RhdHVzIHRoYXQgd2FzIGNhbGN1bGF0ZWQgb3ZlciBhIGxvbmdlciBwZXJpb2Qgb2YgdGltZS4gRm9yIEludmVzdG1lbnQgdXBkYXRlcywgd2hpY2ggYXJlIHJlZnJlc2hlZCBsZXNzIGZyZXF1ZW50bHksIHRoZSBwZXJpb2QgYXNzZXNzZWQgbWF5IGJlIDI0IGhvdXJzIG9yIG1vcmUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbSW5zdGl0dXRpb24gc3RhdHVzIGRldGFpbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jaW5zdGl0dXRpb24tc3RhdHVzLWRldGFpbHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVmcmVzaF9pbnRlcnZhbGAgbWF5IGJlIGBERUxBWUVEYCBvciBgU1RPUFBFRGAgZXZlbiB3aGVuIHRoZSBzdWNjZXNzIHJhdGUgaXMgaGlnaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkIGZvciBUcmFuc2FjdGlvbnMgc3RhdHVzIGJyZWFrZG93bnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSWRlbnRpdHlNYXRjaCA9ICdpZGVudGl0eV9tYXRjaCcsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEludmVzdG1lbnRzQXV0aCA9ICdpbnZlc3RtZW50c19hdXRoJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUGF5bWVudEluaXRpYXRpb24gPSAncGF5bWVudF9pbml0aWF0aW9uJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbiA9ICdpZGVudGl0eV92ZXJpZmljYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBEZXBvc2l0U3dpdGNoID0gJ2RlcG9zaXRfc3dpdGNoJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBFbXBsb3ltZW50ID0gJ2VtcGxveW1lbnQnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9ucyA9ICdyZWN1cnJpbmdfdHJhbnNhY3Rpb25zJyxcbiAgICBTaWduYWwgPSAnc2lnbmFsJyxcbiAgICBTdGF0ZW1lbnRzID0gJ3N0YXRlbWVudHMnXG59XG5cbi8qKlxuICogVGhlIHZhbGlkIG5hbWUgbWF0Y2hpbmcgc2Vuc2l0aXZpdHkgY29uZmlndXJhdGlvbnMgZm9yIGEgc2NyZWVuaW5nIHByb2dyYW0uIE5vdGUgdGhhdCB3aGlsZSBjZXJ0YWluIG1hdGNoaW5nIHRlY2huaXF1ZXMgbWF5IGJlIG1vcmUgcHJldmFsZW50IG9uIGxlc3Mgc3RyaWN0IHNldHRpbmdzLCBhbGwgbWF0Y2hpbmcgYWxnb3JpdGhtcyBhcmUgZW5hYmxlZCBmb3IgZXZlcnkgc2Vuc2l0aXZpdHkuICBgY29hcnNlYCAtIFNlZSBtb3JlIHBvdGVudGlhbCBtYXRjaGVzLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgc2VlIG1vcmUgYnJvYWQgcGhvbmV0aWMgbWF0Y2hlcyBhY3Jvc3MgYWxwaGFiZXRzIHRoYXQgbWFrZSBtaXNzaW5nIGEgcG90ZW50aWFsIGhpdCB2ZXJ5IHVubGlrZWx5LiBUaGlzIHNldHRpbmcgaXMgbm9pc2llciBhbmQgd2lsbCByZXF1aXJlIG1vcmUgbWFudWFsIHJldmlldy4gIGBiYWxhbmNlZGAgLSBBIGdvb2QgZGVmYXVsdCBmb3IgbW9zdCBjb21wYW5pZXMuIFRoaXMgc2Vuc2l0aXZpdHkgaXMgYmFsYW5jZWQgdG8gc2hvdyBoaWdoIHF1YWxpdHkgaGl0cyB3aXRoIHJlZHVjZWQgbm9pc2UuICBgc3RyaWN0YCAtIEFnZ3Jlc3NpdmUgZmFsc2UgcG9zaXRpdmUgcmVkdWN0aW9uLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgcmVxdWlyZSBuYW1lcyB0byBiZSBtb3JlIHNpbWlsYXIgdGhhbiBgY29hcnNlYCBhbmQgYGJhbGFuY2VkYCBzZXR0aW5ncywgcmVseWluZyBsZXNzIG9uIHBob25ldGljcywgd2hpbGUgc3RpbGwgYWNjb3VudGluZyBmb3IgY2hhcmFjdGVyIHRyYW5zcG9zaXRpb25zLCBtaXNzaW5nIHRva2VucywgYW5kIG90aGVyIGNvbW1vbiBwZXJtdXRhdGlvbnMuICBgZXhhY3RgIC0gTWF0Y2hlcyBtdXN0IGJlIG5lYXJseSBleGFjdC4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIG9ubHkgc2hvdyBoaXRzIHdpdGggZXhhY3Qgb3IgbmVhcmx5IGV4YWN0IG5hbWUgbWF0Y2hlcyB3aXRoIG9ubHkgYmFzaWMgY29ycmVjdGlvbiBzdWNoIGFzIGV4dHJhbmVvdXMgc3ltYm9scyBhbmQgY2FwaXRhbGl6YXRpb24uIFRoaXMgc2V0dGluZyBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UgaGF2ZSBhIHZlcnkgc3BlY2lmaWMgdXNlIGNhc2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5IHtcbiAgICBDb2Fyc2UgPSAnY29hcnNlJyxcbiAgICBCYWxhbmNlZCA9ICdiYWxhbmNlZCcsXG4gICAgU3RyaWN0ID0gJ3N0cmljdCcsXG4gICAgRXhhY3QgPSAnZXhhY3QnXG59XG5cbi8qKlxuICogVGhlIGVtcGxveWVlXFwncyBlc3RpbWF0ZWQgYW5udWFsIHNhbGFyeSwgYXMgZGVyaXZlZCBmcm9tIGluZm9ybWF0aW9uIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgbmV0d29yayBwcm94eSBpcyBwcmVzZW50IGFuZCBpZiBzbyB3aGF0IHR5cGUgaXQgaXMuICBgbm9uZV9kZXRlY3RlZGAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG5vdCBvbiBhIGRldGVjdGFibGUgcHJveHkgbmV0d29yay4gIGB0b3JgIGluZGljYXRlcyB0aGUgdXNlciB3YXMgdXNpbmcgYSBUb3IgYnJvd3Nlciwgd2hpY2ggc2VuZHMgZW5jcnlwdGVkIHRyYWZmaWMgb24gYSBkZWNlbnRyYWxpemVkIG5ldHdvcmsgYW5kIGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8gYSBWUE4gKFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrKS4gIGB2cG5gIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspICBgd2ViX3Byb3h5YCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgb24gYSB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBtYXkgYWxsb3cgdGhlbSB0byBjb25jZWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlaXIgSVAgYWRkcmVzcyBvciBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gIGBwdWJsaWNfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHB1YmxpYyB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBpcyBzaW1pbGFyIHRvIGEgd2ViIHByb3h5IGJ1dCBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHVzZXJzLiBUaGlzIG1heSBhbGxvdyBtdWx0aXBsZSB1c2VycyB0byBhcHBlYXIgYXMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIElQIGFkZHJlc3MgZm9yIGluc3RhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJveHlUeXBlIHtcbiAgICBOb25lRGV0ZWN0ZWQgPSAnbm9uZV9kZXRlY3RlZCcsXG4gICAgVG9yID0gJ3RvcicsXG4gICAgVnBuID0gJ3ZwbicsXG4gICAgV2ViUHJveHkgPSAnd2ViX3Byb3h5JyxcbiAgICBQdWJsaWNQcm94eSA9ICdwdWJsaWNfcHJveHknXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgd2FzIGZsYWdnZWQgYnkgUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSwgYW5kIHJlcXVpcmVzIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIHRvIGVuc3VyZSB0aGV5IGFyZSBub3QgYSBib3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFSZXF1aXJlZEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBSRUNBUFRDSEFfRVJST1JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9SRVFVSVJFRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDQwMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBodHRwX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBzb2x2ZSBhIEdvb2dsZSByZUNBUFRDSEEgY2hhbGxlbmdlIGluIHRoZSBMaW5rIFJlY2FwdGNoYSBwYW5lLiBJZiB0aGV5IHNvbHZlIHRoZSBjaGFsbGVuZ2Ugc3VjY2Vzc2Z1bGx5LCB0aGUgdXNlclxcJ3MgcmVxdWVzdCBpcyByZXN1Ym1pdHRlZCBhbmQgdGhleSBhcmUgZGlyZWN0ZWQgdG8gdGhlIG5leHQgSXRlbSBjcmVhdGlvbiBzdGVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBsaW5rX3VzZXJfZXhwZXJpZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyBmcmF1ZCBzeXN0ZW0gZGV0ZWN0cyBhYnVzaXZlIHRyYWZmaWMgYW5kIGNvbnNpZGVycyBhIHZhcmlldHkgb2YgcGFyYW1ldGVycyB0aHJvdWdob3V0IEl0ZW0gY3JlYXRpb24gcmVxdWVzdHMuIFdoZW4gYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgcmlza3kgb3IgcG9zc2libHkgZnJhdWR1bGVudCwgTGluayBwcmVzZW50cyBhIHJlQ0FQVENIQSBmb3IgdGhlIHVzZXIgdG8gc29sdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGNvbW1vbl9jYXVzZXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaW5rIHdpbGwgYXV0b21hdGljYWxseSBndWlkZSB5b3VyIHVzZXIgdGhyb3VnaCByZUNBUFRDSEEgdmVyaWZpY2F0aW9uLiBBcyBhIGdlbmVyYWwgcnVsZSwgd2UgcmVjb21tZW5kIGluc3RydW1lbnRpbmcgYmFzaWMgZnJhdWQgbW9uaXRvcmluZyB0byBkZXRlY3QgYW5kIHByb3RlY3QgeW91ciB3ZWJzaXRlIGZyb20gc3BhbSBhbmQgYWJ1c2UuICBJZiB5b3VyIHVzZXIgY2Fubm90IHZlcmlmeSB0aGVpciBzZXNzaW9uLCBwbGVhc2Ugc3VibWl0IGEgU3VwcG9ydCB0aWNrZXQgd2l0aCB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiBgbGlua19zZXNzaW9uX2lkYCBvciBgcmVxdWVzdF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgdHJvdWJsZXNob290aW5nX3N0ZXBzOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB5b3UgbmVlZCB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB0aGlzIHJlY2lwaWVudCBuZWVkcyB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogSW5zaWdodHMgcmVsYXRpbmcgdG8gZXhwZW5zZXMgYW5kIGRlcG9zaXRzIHRoYXQgYXJlIHByZWRpY3RlZCB0byBvY2N1ciBvbiBhIHNjaGVkdWxlZCBiYXNpcywgc3VjaCBhcyBiaXdlZWtseSwgbW9udGhseSwgb3IgYW5udWFsbHkuICBDb21tb24gZXhhbXBsZXMgaW5jbHVkZSBsb2FuIHBheW1lbnRzLCBiaWxsIHBheW1lbnRzLCBzdWJzY3JpcHRpb25zLCBhbmQgcGF5cm9sbCBpbmNvbWUuICBUaGlzIGlzIGEgYmV0YSBmaWVsZCwgYXZhaWxhYmxlIHRvIGFsbCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmVuY2Uge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0cmFuc2FjdGlvbiBpcyBwZXJpb2RpY2FsbHkgcmVjdXJyaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJlbmNlXG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ0ZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeT86IFJlY3VycmluZ0ZyZXF1ZW5jeSB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIGJ5IFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX0NBTkNFTExFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uICBgV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB3ZWVrLiAgYEJJV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSAyIHdlZWtzLiAgYFNFTUlfTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgdHdpY2UgcGVyIG1vbnRoLiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMuICBgTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgbW9udGguICBgQU5OVUFMTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHllYXIuICBgREFJTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IGRheS4gIGBEWU5BTUlDYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCB2YXJpZXMgaW4gcmVjdXJyZW5jZSBmcmVxdWVuY3kuIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgc3RyZWFtcyBpbiB0aGUgZ2lnIGVjb25vbXkuICBgVU5LTk9XTmA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgaXNuXFwndCByZWN1cnJpbmcgaW4gbmF0dXJlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmVjdXJyaW5nRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknLFxuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBEeW5hbWljID0gJ0RZTkFNSUMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgc3RyZWFtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50LXByb3ZpZGVkIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBvciBwcmltYXJ5IGNvdW50ZXJwYXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgYXZlcmFnZV9kYXlzX2FwYXJ0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeT86IFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoaXMgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgYXZlcmFnZV9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2Ftb3VudD86IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0gaXMgc3RpbGwgbGl2ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBpc19hY3RpdmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHN0YXR1cz86IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9wcmltYXJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRhaWxlZCBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfZGV0YWlsZWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBuZXcgdHJhbnNmZXIgb2YgYSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgb3JpZ2luYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19ORVdfVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGRvZXMgbm90IGZpdCBhbnkgb2YgdGhlIHByZS1kZWZpbmVkIGZyZXF1ZW5jaWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBBbm51YWxseSA9ICdBTk5VQUxMWSdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGVuZHBvaW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMgKGUuZy4sIGluY29tZSkuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvdXRmbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMgKGUuZy4sIHN1YnNjcmlwdGlvbnMsIGJpbGxzLCBsb2FuIHBheW1lbnRzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgaXMgdXBkYXRlZC4gVGhpcyBpbmNsdWRlcyB3aGVuIGEgbmV3IHJlY3VycmluZyBzdHJlYW0gaXMgZGV0ZWN0ZWQgb3Igd2hlbiBhIG5ldyB0cmFuc2FjdGlvbiBpcyBhZGRlZCB0byBhbiBleGlzdGluZyByZWN1cnJpbmcgc3RyZWFtLiBUaGUgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYCB3ZWJob29rIHdpbGwgYWxzbyBmaXJlIHdoZW4gb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvZiB0aGUgcmVjdXJyaW5nIHN0cmVhbSBjaGFuZ2VzLCB3aGljaCBpcyB1c3VhbGx5IGEgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiwgdXBkYXRlLCBvciByZW1vdmFsIG9mIHRyYW5zYWN0aW9ucyB0byB0aGUgc3RyZWFtLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSB1cGRhdGVkIGRhdGEgY2FuIGJlIGZldGNoZWQgZnJvbSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgZm9yIGFjY291bnRzIHRoYXQgaGF2ZSBuZXcgb3IgdXBkYXRlZCByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlY3VycmluZyB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIG5leHRfb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlY3VycmluZyB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgb24gdGhlIHBsYW5uZWQgZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0ZFUl9TS0lQUEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbl9yYXRpb25hbGVfY29kZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxhbm5lZCBkYXRlIG9uIHdoaWNoIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBza2lwcGVkX29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHJlbW92ZWQgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXBvcnQgdHlwZS4gSXQgY2FuIGJlIGBhc3NldGAuIEluY29tZSByZXBvcnQgdHlwZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmVwb3J0VHlwZSB7XG4gICAgQXNzZXQgPSAnYXNzZXQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb24ge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBiZWhhdmlvcmAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrQmVoYXZpb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIHVzZXJfaW50ZXJhY3Rpb25zOiBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIGZyYXVkX3JpbmdfZGV0ZWN0ZWQ6IFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIGJvdF9kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsO1xufVxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHRoZSBvdXRjb21lIG9mIGEgYm90IGRldGVjdGlvbiBiZWhhdmlvciByaXNrIGNoZWNrLiAgYHllc2AgaW5kaWNhdGVzIHRoYXQgYXV0b21hdGVkIGFjdGl2aXR5IHdhcyBkZXRlY3RlZC4gIGBub2AgaW5kaWNhdGVzIHRoYXQgYXV0b21hdGVkIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yQm90RGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBmcmF1ZCByaW5nIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBkZXRlY3RlZC4gIGBub2AgaW5kaWNhdGVzIHRoYXQgZnJhdWQgcmluZyBhY3Rpdml0eSB3YXMgbm90IGRldGVjdGVkLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGVyZSB3YXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWwge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHRoZSBvdmVyYWxsIHVzZXIgaW50ZXJhY3Rpb24gc2lnbmFscyBvZiBhIGJlaGF2aW9yIHJpc2sgY2hlY2suIFRoaXMgdmFsdWUgcmVwcmVzZW50cyBob3cgZmFtaWxpYXIgdGhlIHVzZXIgaXMgd2l0aCB0aGUgcGVyc29uYWwgZGF0YSB0aGV5IHByb3ZpZGUsIGJhc2VkIG9uIGEgbnVtYmVyIG9mIHNpZ25hbHMgdGhhdCBhcmUgY29sbGVjdGVkIGR1cmluZyB0aGVpciBzZXNzaW9uLiAgYGdlbnVpbmVgIGluZGljYXRlcyB0aGUgdXNlciBoYXMgaGlnaCBmYW1pbGlhcml0eSB3aXRoIHRoZSBkYXRhIHRoZXkgYXJlIHByb3ZpZGluZywgYW5kIHRoYXQgZnJhdWQgaXMgdW5saWtlbHkuICBgbmV1dHJhbGAgaW5kaWNhdGVzIHNvbWUgc2lnbmFscyBhcmUgcHJlc2VudCBpbiBiZXR3ZWVuIGByaXNreWAgYW5kIGBnZW51aW5lYCwgYnV0IHRoZXJlIGFyZSBub3QgZW5vdWdoIGNsZWFyIHNpZ25hbHMgdG8gZGV0ZXJtaW5lIGFuIG91dGNvbWUuICBgcmlza3lgIGluZGljYXRlcyB0aGUgdXNlciBoYXMgbG93IGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyBsaWtlbHkuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIGlzIG5vdCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWwge1xuICAgIEdlbnVpbmUgPSAnZ2VudWluZScsXG4gICAgTmV1dHJhbCA9ICduZXV0cmFsJyxcbiAgICBSaXNreSA9ICdyaXNreScsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGByaXNrX2NoZWNrYCBzdGVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGJlaGF2aW9yOiBSaXNrQ2hlY2tCZWhhdmlvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZW1haWw6IFJpc2tDaGVja0VtYWlsIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrUGhvbmV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZTogUmlza0NoZWNrUGhvbmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHJlc3VsdCBzdW1tYXJ5IG9iamVjdHMgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBkZXZpY2VgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza0NoZWNrRGV2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGRldmljZXM6IEFycmF5PFJpc2tDaGVja0RldmljZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgaWRlbnRpdHlfYWJ1c2Vfc2lnbmFsczogUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHMgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBkZXZpY2VgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJveHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9wcm94eV90eXBlOiBQcm94eVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHNwYW0gbGlzdHMgdGhlIElQIGFkZHJlc3MgaXMgYXNzb2NpYXRlZCB3aXRoIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3NwYW1fbGlzdF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVVEMgb2Zmc2V0IG9mIHRoZSB0aW1lem9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIElQIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfdGltZXpvbmVfb2Zmc2V0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBlbWFpbGAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0VtYWlsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGlzX2RlbGl2ZXJhYmxlOiBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgYWxsIGtub3duIGJyZWFjaGVzIG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpZiBrbm93bi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGJyZWFjaF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmaXJzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsYXN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9yZWdpc3RlcmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19mcmVlX3Byb3ZpZGVyOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19jdXN0b206IFJpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b207XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19kaXNwb3NhYmxlOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICB0b3BfbGV2ZWxfZG9tYWluX2lzX3N1c3BpY2lvdXM6IFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXM7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIGVtYWlsIGFkZHJlc3MgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgY3VzdG9tIGlmIGtub3duLCBpLmUuIGEgY29tcGFueSBkb21haW4gYW5kIG5vdCBmcmVlIG9yIGRpc3Bvc2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGRvbWFpbiBpcyBsaXN0ZWQgYXMgZGlzcG9zYWJsZSBpZiBrbm93bi4gRGlzcG9zYWJsZSBkb21haW5zIGFyZSBvZnRlbiB1c2VkIHRvIGNyZWF0ZSBlbWFpbCBhZGRyZXNzZXMgdGhhdCBhcmUgcGFydCBvZiBhIGZha2Ugc2V0IG9mIHVzZXIgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGEgZnJlZSBwcm92aWRlciBzdWNoIGFzIEdtYWlsIG9yIEhvdG1haWwgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogU01UUC1NWCBjaGVjayB0byBjb25maXJtIHRoZSBlbWFpbCBhZGRyZXNzIGV4aXN0cyBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIHRvcCBsZXZlbCBkb21haW4sIHdoaWNoIGlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGRvbWFpbiwgaXMgZnJhdWR1bGVudCBvciByaXNreSBpZiBrbm93bi4gSW4gbW9zdCBjYXNlcywgYSBzdXNwaWNpb3VzIHRvcCBsZXZlbCBkb21haW4gaXMgYWxzbyBhc3NvY2lhdGVkIHdpdGggYSBkaXNwb3NhYmxlIG9yIGhpZ2gtcmlzayBkb21haW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IGNhcHR1cmluZyBhYnVzZSBzaWduYWxzIHJlbGF0ZWQgdG8gYGlkZW50aXR5IGFidXNlYCwgZS5nLiBzdG9sZW4gYW5kIHN5bnRoZXRpYyBpZGVudGl0eSBmcmF1ZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlIHtcbiAgICBBcHBsZSA9ICdhcHBsZScsXG4gICAgRWJheSA9ICdlYmF5JyxcbiAgICBGYWNlYm9vayA9ICdmYWNlYm9vaycsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRm91cnNxdWFyZSA9ICdmb3Vyc3F1YXJlJyxcbiAgICBHaXRodWIgPSAnZ2l0aHViJyxcbiAgICBHb29nbGUgPSAnZ29vZ2xlJyxcbiAgICBHcmF2YXRhciA9ICdncmF2YXRhcicsXG4gICAgSW5zdGFncmFtID0gJ2luc3RhZ3JhbScsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGlua2VkaW4gPSAnbGlua2VkaW4nLFxuICAgIE1pY3Jvc29mdCA9ICdtaWNyb3NvZnQnLFxuICAgIE15c3BhY2UgPSAnbXlzcGFjZScsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgU2t5cGUgPSAnc2t5cGUnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFR1bWJsciA9ICd0dW1ibHInLFxuICAgIFR3aXR0ZXIgPSAndHdpdHRlcicsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBXZWlibyA9ICd3ZWlibycsXG4gICAgV2hhdHNhcHAgPSAnd2hhdHNhcHAnLFxuICAgIFlhaG9vID0gJ3lhaG9vJyxcbiAgICBBaXJibmIgPSAnYWlyYm5iJyxcbiAgICBBbWF6b24gPSAnYW1hem9uJyxcbiAgICBCb29raW5nID0gJ2Jvb2tpbmcnLFxuICAgIERpc2NvcmQgPSAnZGlzY29yZCcsXG4gICAgS2FrYW8gPSAna2FrYW8nLFxuICAgIE9rID0gJ29rJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBTbmFwY2hhdCA9ICdzbmFwY2hhdCcsXG4gICAgWmFsbyA9ICd6YWxvJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3ludGhldGljIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0IGFmdGVyIGV2YWx1YXRlZCBieSB0aGUgcmVxdWVzdGVkIHJpc2sgcHJvZmlsZS4gSWYgYSBgcmlza19wcm9maWxlX2tleWAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tQcm9maWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1Byb2ZpbGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByaXNrIHByb2ZpbGUgdXNlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUHJvZmlsZVxuICAgICAqL1xuICAgIGtleT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXZhbHVhdGVkIG91dGNvbWUgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1Byb2ZpbGVcbiAgICAgKi9cbiAgICBvdXRjb21lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBmb3IgdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUmlza1NpZ25hbERvY3VtZW50U3RhdHVzO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgYSBkb2N1bWVudCBmb3IgcmlzayBzaWduYWwgYW5hbHlzaXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tTaWduYWxEb2N1bWVudFN0YXR1cyB7XG4gICAgUHJvY2Vzc2luZyA9ICdQUk9DRVNTSU5HJyxcbiAgICBQcm9jZXNzaW5nQ29tcGxldGUgPSAnUFJPQ0VTU0lOR19DT01QTEVURScsXG4gICAgUHJvY2Vzc2luZ0Vycm9yID0gJ1BST0NFU1NJTkdfRVJST1InLFxuICAgIFBhc3N3b3JkUHJvdGVjdGVkID0gJ1BBU1NXT1JEX1BST1RFQ1RFRCcsXG4gICAgVmlydXNEZXRlY3RlZCA9ICdWSVJVU19ERVRFQ1RFRCdcbn1cblxuLyoqXG4gKiBBRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVEZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFJvbGVcbiAgICAgKi9cbiAgICBST0xFX0RFVEFJTDogUm9sZURldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5Um9sZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJvbGVEZXRhaWxcbiAgICAgKi9cbiAgICBQYXJ0eVJvbGVUeXBlOiBQYXJ0eVJvbGVUeXBlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlc1xuICAgICAqL1xuICAgIFJPTEU6IFJvbGU7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBVUkwgc2V0IGluIHRoZSBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX292ZXJyaWRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfZmllbGRzOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHM7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgY29kZXMgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byB0ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlIHtcbiAgICBVcGRhdGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEUnLFxuICAgIENvbXBsZXRlID0gJ0JBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEUnXG59XG5cbi8qKlxuICogT3B0aW9uYWwgZmllbGRzIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIHRoZSBzaW11bGF0ZWQgd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGlkIHRvIGJlIHJldHVybmVkIGluIElOQ09NRSB3ZWJob29rc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVmcmVzaF9jb21wbGV0ZV9yZXN1bHQ/OiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGF0dXMgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgZW5kcG9pbnQgYW5kIGNoZWNrIHRoZSBkb2N1bWVudCBtZXRhZGF0YSB0byBzZWUgd2hpY2ggZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEYDogQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbi4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BFTkRJTkdfQVBQUk9WQUxgOiAoZGVwcmVjYXRlZCkgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2VudCB0byB0aGUgdXNlciBmb3IgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBQcm9jZXNzaW5nQ29tcGxldGUgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFJyxcbiAgICBQcm9jZXNzaW5nRmFpbGVkID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRUQnLFxuICAgIFBlbmRpbmdBcHByb3ZhbCA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BFTkRJTkdfQVBQUk9WQUwnXG59XG5cbi8qKlxuICogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFZlcmlmaWNhdGlvbiA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OJyxcbiAgICBWZXJpZmljYXRpb25SaXNrU2lnbmFscyA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMUydcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogV2ViaG9va1R5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgY29kZXMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgdGhpcyB0ZXN0IGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFdlYmhvb2tDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFdlYmhvb2tDb2RlRW51bSB7XG4gICAgRGVmYXVsdFVwZGF0ZSA9ICdERUZBVUxUX1VQREFURScsXG4gICAgTmV3QWNjb3VudHNBdmFpbGFibGUgPSAnTkVXX0FDQ09VTlRTX0FWQUlMQUJMRScsXG4gICAgQXV0aERhdGFVcGRhdGUgPSAnQVVUSF9EQVRBX1VQREFURScsXG4gICAgQXV0aG9yaXphdGlvbkdyYW50ZWQgPSAnQVVUSE9SSVpBVElPTl9HUkFOVEVEJyxcbiAgICBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGUgPSAnUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEUnLFxuICAgIFN5bmNVcGRhdGVzQXZhaWxhYmxlID0gJ1NZTkNfVVBEQVRFU19BVkFJTEFCTEUnLFxuICAgIFByb2R1Y3RSZWFkeSA9ICdQUk9EVUNUX1JFQURZJyxcbiAgICBFcnJvciA9ICdFUlJPUidcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgaXMgYHRydWVgICBpZiB0aGUgdGVzdGAgd2ViaG9va19jb2RlYCAgd2FzIHN1Y2Nlc3NmdWxseSBmaXJlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgd2ViaG9va19maXJlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgd2hvc2UgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB0byBiZSBtb2RpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyB0byBzZXQgdGhlIGFjY291bnQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBzYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBvYXV0aF9zdGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbj86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uO1xufVxuLyoqXG4gKiBBIHNldCBvZiBwYXJhbWV0ZXJzIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIG9wdGlvbnMuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGluY29tZV92ZXJpZmljYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgaW5pdGlhbF9wcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZTtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbnMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHVibGljIHRva2VuIHRoYXQgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgb25seSB0aGUgcGVuZGluZyBiYWxhbmNlIHRoYXQgaXMgZHVlIGJlZm9yZSB0aGUgYHZpcnR1YWxfdGltZXN0YW1wYCBvbiB0aGUgdGVzdCBjbG9jayB3aWxsIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBldmVudCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcmVmdW5kLnBvc3RlZGAsIGByZWZ1bmQuc2V0dGxlZGAsIGByZWZ1bmQuZmFpbGVkYCwgb3IgYHJlZnVuZC5yZXR1cm5lZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHJlZnVuZCBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcmVmdW5kLnBlbmRpbmdgIC0tPiBgcmVmdW5kLmZhaWxlZGAgIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQucG9zdGVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnJldHVybmVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnNldHRsZWRgICBgcmVmdW5kLnBvc3RlZGAgZXZlbnRzIGNhbiBvbmx5IGJlIHNpbXVsYXRlZCBpZiB0aGUgcmVmdW5kZWQgdHJhbnNmZXIgaGFzIGJlZW4gdHJhbnNpdGlvbmVkIHRvIHNldHRsZWQuIFRoaXMgbWltaWNzIHRoZSBvcmRlcmluZyBvZiBldmVudHMgaW4gUHJvZHVjdGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCB0aGUgZXZlbnQgdG8gYmUgc2ltdWxhdGVkIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBzZXR0bGVkYCwgYGZhaWxlZGAsIG9yIGByZXR1cm5lZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV0dXJuZWRgICBgcG9zdGVkYCAtLT4gYHNldHRsZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIHN3ZWVwIHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIG9uIHRoZSBkYXkgb2YgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBgdGVzdF9jbG9ja2AuIElmIHRoZSBkYXRlIG9mIGB2aXJ0dWFsX3RpbWVgIGlzIG9uIHdlZWtlbmQgb3IgYSBmZWRlcmFsIGhvbGlkYXksIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcD86IFNpbXVsYXRlZFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXdfdmlydHVhbF90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgdmlydHVhbCB0aW1lc3RhbXAgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3ZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3ZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRlc3QgY2xvY2tzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyVGVzdENsb2NrPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9ja3M6IEFycmF5PFRyYW5zZmVyVGVzdENsb2NrPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBuZXdfYWNjb3VudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5kaWNhdG9yIGZvciB3aGVuIHNjb3BlcyBhcmUgYmVpbmcgdXBkYXRlZC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgdmlhIGVucm9sbG1lbnQgKGkuZS4gT0F1dGgpLCB0aGUgcGFydG5lciBtdXN0IHNlbmQgYEVOUk9MTE1FTlRgLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBpbiBhIHBvc3QtZW5yb2xsbWVudCB2aWV3LCB0aGUgcGFydG5lciBtdXN0IHNlbmQgYFBPUlRBTGAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTY29wZXNDb250ZXh0IHtcbiAgICBFbnJvbGxtZW50ID0gJ0VOUk9MTE1FTlQnLFxuICAgIFBvcnRhbCA9ICdQT1JUQUwnXG59XG5cbi8qKlxuICogVGhlIHNjb3BlcyBvYmplY3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NvcGVzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdXNlciBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCB0aGF0IHdlcmUgY29tcGFyZWQgd2hlbiB0aGUgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AsIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGEge1xuICAgIC8qKlxuICAgICAqIERhdGVzIG9mIGJpcnRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZGF0ZXNfb2ZfYmlydGg/OiBBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIExvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogQXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIE5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIG5hbWVzPzogQXJyYXk8U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz47XG59XG4vKipcbiAqIEFuYWx5emVkIGRhdGUgb2YgYmlydGggZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRlUmFuZ2V9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGRhdGE/OiBEYXRlUmFuZ2U7XG59XG4vKipcbiAqIEFuYWx5emVkIGRvY3VtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50O1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBpbmRpdmlkdWFsIHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgU0NSRUVOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHNjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHNlY3VyaXR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHkge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzaW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjdXNpcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlZG9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZ2l2ZW4gdG8gdGhlIHNlY3VyaXR5IGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkYCBpcyBwcmVzZW50LCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgUGxhaWQgYGluc3RpdHV0aW9uX2lkYCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gd2hvbSB0aGUgaWRlbnRpZmllciBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW4gY2VydGFpbiBjYXNlcywgUGxhaWQgd2lsbCBwcm92aWRlIHRoZSBJRCBvZiBhbm90aGVyIHNlY3VyaXR5IHdob3NlIHBlcmZvcm1hbmNlIHJlc2VtYmxlcyB0aGlzIHNlY3VyaXR5LCB0eXBpY2FsbHkgd2hlbiB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgaGFzIGxvdyB2b2x1bWUsIG9yIHdoZW4gYSBwcml2YXRlIHNlY3VyaXR5IGNhbiBiZSBtb2RlbGVkIHdpdGggYSBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBwcm94eV9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgc2VjdXJpdHkgaXMgYSBoaWdobHkgbGlxdWlkIGFzc2V0IGFuZCBjYW4gYmUgdHJlYXRlZCBsaWtlIGNhc2guXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNfY2FzaF9lcXVpdmFsZW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgdHlwZSBvZiB0aGUgaG9sZGluZy4gVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3B0aW9uQ29udHJhY3R9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgb3B0aW9uX2NvbnRyYWN0OiBPcHRpb25Db250cmFjdCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpc2luPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDktY2hhcmFjdGVyIENVU0lQLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIE5vcnRoIEFtZXJpY2FuIHNlY3VyaXRpZXMuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXNpcD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2Vkb2w/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgc2VjdXJpdHksIHN1aXRhYmxlIGZvciBkaXNwbGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIHNlbGZpZSB3YXMgcHJvY2Vzc2VkLiBJZiBhIHNlbGZpZSBmYWlscyB2ZXJpZmljYXRpb24sIHRoZSBkZXRhaWxzIGluIHRoZSBgYW5hbHlzaXNgIG9iamVjdCBzaG91bGQgaGVscCBjbGFyaWZ5IHdoeSB0aGUgc2VsZmllIHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29ufVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50X2NvbXBhcmlzb246IFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzZWxmaWUgYW5kIHRoZSBkb2N1bWVudCAoaWYgZG9jdW1lbnRhcnkgdmVyaWZpY2F0aW9uIGFsc28gcmFuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBUaGUgaW1hZ2Ugb3IgdmlkZW8gY2FwdHVyZSBvZiBhIHNlbGZpZS4gT25seSBvbmUgb2YgaW1hZ2Ugb3IgdmlkZW8gVVJMIHdpbGwgYmUgcG9wdWxhdGVkIHBlciBzZWxmaWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNhcHR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVDYXB0dXJlIHtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIGZvciBkb3dubG9hZGluZyBhbiBpbWFnZSBzZWxmaWUgY2FwdHVyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDYXB0dXJlXG4gICAgICovXG4gICAgaW1hZ2VfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgZm9yIGRvd25sb2FkaW5nIGEgdmlkZW8gc2VsZmllIGNhcHR1cmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIHZpZGVvX3VybDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5zZWxmaWVfY2hlY2tgIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2hlY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVDaGVjayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHN0YXR1czogU2VsZmllQ2hlY2tTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygc2VsZmllcyBzdWJtaXR0ZWQgdG8gdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlciBzdWJtaXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWxmaWVDaGVja1NlbGZpZT59XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrXG4gICAgICovXG4gICAgc2VsZmllczogQXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+O1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhbmQgYW5hbHlzaXMgZnJvbSBhIHVzZXJcXCdzIHNlbGZpZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmaWVDaGVja1NlbGZpZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF0dGVtcHRgIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2VsZmllIHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2FwdHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBjYXB0dXJlOiBTZWxmaWVDYXB0dXJlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhbmFseXNpczogU2VsZmllQW5hbHlzaXM7XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGBzZWxmaWVfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBgc3RlcHMuc2VsZmllX2NoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUNoZWNrU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgc2VsZmllLiBEaXN0aW5jdCBmcm9tIHRoZSBvdmVyYWxsIGBzZWxmaWVfY2hlY2suc3RhdHVzYCB0aGF0IHN1bW1hcml6ZXMgdGhlIHZlcmlmaWNhdGlvbiBvdXRjb21lIGZyb20gb25lIG9yIG1vcmUgc2VsZmllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZVN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB0aGlzIHJlY2lwaWVudCBuZWVkcyB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VuZGVyQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGRldGFpbHMgcmVsYXRlZCB0byBhIGZ1bGZpbGxtZW50IHNlcnZpY2Ugb3IgcHJvZHVjdCBpbiB0ZXJtcyBvZiByZXF1ZXN0LCBwcm9jZXNzIGFuZCByZXN1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uT2ZBc3NldH1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogVmVyaWZpY2F0aW9uT2ZBc3NldDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzZXN9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlRfREVUQUlMOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSB0eXBlIG9mIG9yZGVyIFZlcmlmaWNhdGlvbiBvZiBBc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gICAgICovXG4gICAgVmVuZG9yT3JkZXJJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXIge1xuICAgIFZvYSA9ICdWT0EnLFxuICAgIFZvZSA9ICdWT0UnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIHN0dWRlbnQgbG9hbiBzZXJ2aWNlci4gVGhpcyBpcyBnZW5lcmFsbHkgdGhlIHJlbWl0dGFuY2UgYWRkcmVzcyB0byB3aGljaCBwYXltZW50cyBzaG91bGQgYmUgc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZm9yIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBTZXJ2aWNlO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgZGVjaXNpb24gZnJvbSB0aGUgcmlzayBhc3Nlc3NtZW50LiAgYEFQUFJPVkVgOiBhcHByb3ZlIHRoZSB0cmFuc2FjdGlvbiB3aXRob3V0IHJlcXVpcmluZyBmdXJ0aGVyIGFjdGlvbnMgZnJvbSB5b3VyIGN1c3RvbWVycy4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBhcmUgcGxhY2luZyBhIHN0YW5kYXJkIGhvbGQgZm9yIGFsbCB0aGUgYXBwcm92ZWQgdHJhbnNhY3Rpb25zIGJlZm9yZSBtYWtpbmcgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzLiBZb3Ugc2hvdWxkIGFsc28gdXNlIHRoaXMgZmllbGQgaWYgeW91IGRlY2lkZSB0byBhY2NlbGVyYXRlIHRoZSBmdW5kIGF2YWlsYWJpbGl0eSBmb3IgeW91ciBjdXN0b21lcnMuICBgUkVWSUVXYDogdGhlIHRyYW5zYWN0aW9uIHJlcXVpcmVzIG1hbnVhbCByZXZpZXcgIGBSRUpFQ1RgOiByZWplY3QgdGhlIHRyYW5zYWN0aW9uICBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYDogZm9yIGV4YW1wbGUsIHBsYWNpbmcgYSBsb25nZXIgaG9sZCBvbiBmdW5kcyB0aGFuIHRob3NlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBvciBpbnRyb2R1Y2luZyBjdXN0b21lciBmcmljdGlvbnMgc3VjaCBhcyBzdGVwLXVwIHZlcmlmaWNhdGlvbi9hdXRoZW50aWNhdGlvbiAgYE5PVF9FVkFMVUFURURgOiBpZiBvbmx5IGxvZ2dpbmcgdGhlIFNpZ25hbCByZXN1bHRzIHdpdGhvdXQgdXNpbmcgdGhlbSAgUG9zc2libGUgdmFsdWVzOiAgYEFQUFJPVkVgLCBgUkVWSUVXYCwgYFJFSkVDVGAsIGBUQUtFX09USEVSX1JJU0tfTUVBU1VSRVNgLCBgTk9UX0VWQUxVQVRFRGAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTaWduYWxEZWNpc2lvbk91dGNvbWUge1xuICAgIEFwcHJvdmUgPSAnQVBQUk9WRScsXG4gICAgUmV2aWV3ID0gJ1JFVklFVycsXG4gICAgUmVqZWN0ID0gJ1JFSkVDVCcsXG4gICAgVGFrZU90aGVyUmlza01lYXN1cmVzID0gJ1RBS0VfT1RIRVJfUklTS19NRUFTVVJFUycsXG4gICAgTm90RXZhbHVhdGVkID0gJ05PVF9FVkFMVUFURUQnXG59XG5cbi8qKlxuICogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gXFxcIk1vemlsbGEvNS4wXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICB1c2VyX2FnZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGNvcmUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgYWRkaXRpb25hbCBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXNzIHRoZSBBQ0ggcmV0dXJuIHJpc2suIEV4YW1wbGVzIG9mIGRhdGEgaW5jbHVkZTogIGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudGA6IEluZGljYXRlcyB3aGV0aGVyIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudCAgRm9yIHRoZSBmdWxsIGxpc3QgYW5kIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2YgY29yZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSwgb3IgdG8gcmVxdWVzdCB0aGF0IGNvcmUgYXR0cmlidXRlcyBub3QgYmUgcmV0dXJuZWQsIGNvbnRhY3QgU2FsZXMgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB3aXRoaW4gdGhlIHBhc3QgOTAgZGF5cyB3aGVuIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIGhhZCBhIG5lZ2F0aXZlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmFpbGFibGUgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYXZhaWxhYmxlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjdXJyZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfMTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGViaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGNyZWRpdF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDMxIGFuZCBkYXkgNjAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV8zMWRfdG9fNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gZGF5IDYxIGFuZCBkYXkgOTAgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV82MWRfdG9fOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19sYXN0X3VwZGF0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgcmVjZWl2ZXIgYmFuayBhY2NvdW50IGlzIGNsb3NlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9jbG9zZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBlaXRoZXIgZnJvemVuIG9yIHJlc3RyaWN0ZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfZnJvemVuX29yX3Jlc3RyaWN0ZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGlzIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uOyBgZmFsc2VgIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJpc2sgcHJvZmlsZSB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIEEgcmlzayBwcm9maWxlIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHZpYSB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIHJpc2sgcHJvZmlsZSB3aWxsIGJlIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJpc2tfcHJvZmlsZV9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvaW5jb21lL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzPzogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1Byb2ZpbGV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX3Byb2ZpbGU/OiBSaXNrUHJvZmlsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIHRoZSByaXNrIGFzc2Vzc21lbnQuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBwYXltZW50IG1ldGhvZC4gIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTkFDSEEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5ICBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyAgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSAgYFJFQUxfVElNRV9QQVlNRU5UU2A6IHJlYWwtdGltZSBwYXltZW50cyBzdWNoIGFzIFJUUCBhbmQgRmVkTm93ICBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgIFBvc3NpYmxlIHZhbHVlczogYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2AgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTaWduYWxQYXltZW50TWV0aG9kIHtcbiAgICBTYW1lRGF5QWNoID0gJ1NBTUVfREFZX0FDSCcsXG4gICAgTmV4dERheUFjaCA9ICdORVhUX0RBWV9BQ0gnLFxuICAgIFN0YW5kYXJkQWNoID0gJ1NUQU5EQVJEX0FDSCcsXG4gICAgUmVhbFRpbWVQYXltZW50cyA9ICdSRUFMX1RJTUVfUEFZTUVOVFMnLFxuICAgIERlYml0Q2FyZCA9ICdERUJJVF9DQVJEJyxcbiAgICBNdWx0aXBsZVBheW1lbnRNZXRob2RzID0gJ01VTFRJUExFX1BBWU1FTlRfTUVUSE9EUydcbn1cblxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgcHJlZml4IChlLmcuIFxcXCJNci5cXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBwcmVmaXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBnaXZlbiBuYW1lLiBJZiB0aGUgdXNlciBoYXMgYSBvbmUtd29yZCBuYW1lLCBpdCBzaG91bGQgYmUgcHJvdmlkZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIG1pZGRsZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmFtaWx5IG5hbWUgLyBzdXJuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbmFtZSBzdWZmaXggKGUuZy4gXFxcIklJXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxQcmVwYXJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY29yZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsVXNlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFBlcnNvbk5hbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogU2lnbmFsUGVyc29uTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1MTIzNDU2N1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFNpZ25hbEFkZHJlc3NEYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgbWlzc2luZyBvciBzdGFsZSBiYW5rIGRhdGEgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIC9zaWduYWwvZXZhbHVhdGUgc2NvcmVzIGFuZCByZXNwb25zZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgd2FybmluZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZyB0aGF0IHBlcnRhaW5zIHRvIHRoZSBlcnJvciBjYXVzaW5nIGJhbmsgZGF0YSB0byBiZSBtaXNzaW5nLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHdhcm5pbmcgY29kZXMsIHBsZWFzZSByZWZlciB0byBQbGFpZCBzdGFuZGFyZCBlcnJvciBjb2RlcyBkb2N1bWVudGF0aW9uLiBJZiB5b3UgcmVjZWl2ZSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdhcm5pbmcsIHdlIHJlY29tbWVuZCByZS1hdXRoZW50aWNhdGluZyB5b3VyIHVzZXIgYnkgaW1wbGVtZW50aW5nIExpbmtcXCdzIHVwZGF0ZSBtb2RlLiBUaGlzIHdpbGwgZ3VpZGUgeW91ciB1c2VyIHRvIGZpeCB0aGVpciBjcmVkZW50aWFscywgYWxsb3dpbmcgUGxhaWQgdG8gc3RhcnQgZmV0Y2hpbmcgZGF0YSBhZ2FpbiBmb3IgZnV0dXJlIFNpZ25hbCByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3YXJuaW5nIHR5cGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3dlZXAgcmV0dXJuZWQgZnJvbSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludC4gQ2FuIGJlIG51bGwgaWYgdGhlcmUgYXJlIG5vIHRyYW5zZmVycyB0byBpbmNsdWRlIGluIGEgc3dlZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIGRlY2ltYWwgYW1vdW50IG9mIHRoZSBzd2VlcCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgc3dlZXAgYWNjb3VudCBsZWRnZXIgKGUuZy4gXFxcIi0xMC4wMFxcXCIpICBJZiBhbW91bnQgaXMgbm90IHByZXNlbnQsIHRoZSBzd2VlcCB3YXMgbmV0LXNldHRsZWQgdG8gemVybyBhbmQgb3V0c3RhbmRpbmcgZGViaXRzIGFuZCBjcmVkaXRzIGJldHdlZW4gdGhlIHN3ZWVwIGFjY291bnQgYW5kIFBsYWlkIGFyZSBiYWxhbmNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzd2VlcCBzZXR0bGVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHNldHRsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc3RhdHVzPzogU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEN1cnJlbnRseSwgdGhlIGZpZWxkIHdpbGwgcmVtYWluIG51bGwgZm9yIHRyYW5zZmVycyBvbiBvdGhlciByYWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGRlcG9zaXRvcnlgIGFjY291bnRzIGFyZTogQXV0aCAoYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIHR5cGVzIG9ubHkpLCBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBQYXltZW50IEluaXRpYXRpb24sIEFzc2V0cywgYW5kIEludmVzdG1lbnRzIChgY2FzaCBtYW5hZ2VtZW50YCB0eXBlIG9ubHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNyZWRpdCBjYXJkIHR5cGUgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgY3JlZGl0YCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBMaWFiaWxpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBjcmVkaXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxvYW4gdHlwZSBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBsb2FuYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIExpYWJpbGl0aWVzLCBhbmQgVHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGxvYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpbnZlc3RtZW50IGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGludmVzdG1lbnRgIGFjY291bnRzIGFyZTogQmFsYW5jZSBhbmQgSW52ZXN0bWVudHMuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGludmVzdG1lbnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdGhlciBvciB1bmtub3duIGFjY291bnQgdHlwZS4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgb3RoZXJgIGFjY291bnRzIGFyZTogQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgYW5kIEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGN1cnJlbmN5IGNvZGVzIGFyZSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3Qge1xuICAgIC8qKlxuICAgICAqIFBsYWlkIHN1cHBvcnRzIGFsbCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgdmFsdWVzIGZvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcy4gTm90ZSB0aGF0IHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgaW5mbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgbmVnYXRpdmUgYW1vdW50cywgb3V0ZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIHBvc2l0aXZlIGFtb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIC8qKlxuICAgICAqIEJ1eWluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBidXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZWxsaW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHNlbGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhbmNlbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYXNoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmVlcyBvbiB0aGUgYWNjb3VudCwgZS5nLiBjb21taXNzaW9uLCBib29ra2VlcGluZywgb3B0aW9ucy1yZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgZmVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbWFzazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9vZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnR5cGUgb2YgdGhlIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHN0YXRlbWVudHNcXCcgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgc3RhdGVtZW50czogQXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD47XG59XG4vKipcbiAqIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9kb3dubG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFN0YXRlbWVudHNBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCByZWZyZXNoIGV4dHJhY3Rpb24gIGBTVUNDRVNTYDogVGhlIHN0YXRlbWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIGFuZCBjYW4gYmUgbGlzdGVkIHZpYSBgL3N0YXRlbWVudHMvbGlzdC9gIGFuZCBkb3dubG9hZGVkIHZpYSBgL3N0YXRlbWVudHMvZG93bmxvYWQvYC4gIGBGQUlMVVJFYDogVGhlIHN0YXRlbWVudHMgZmFpbGVkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gcmVmcmVzaGVkIHN0YXRlbWVudHMgZXh0cmFjdGlvbiBpcyBjb21wbGV0ZWQgb3IgZmFpbGVkIHRvIGJlIGNvbXBsZXRlZC4gVHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9zdGF0ZW1lbnRzL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgU1RBVEVNRU5UU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIzLTA4LTMwXFxcIi4gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGF0ZSByYW5nZSwgUGxhaWQgd2lsbCB1c2UgdGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZS4gVGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZSBpcyB0eXBpY2FsbHkgZWl0aGVyIHRoZSBsYXN0IGRheSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCwgb3IgdGhlIGZvbGxvd2luZyBkYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4g4oCcWVlZWS1NTS1EROKAnSBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2lzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgbG9hbiwgZS5nLiwgXFxcIkNvbnNvbGlkYXRpb24gTG9hbnNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcGF5bWVudCBkdWUgZm9yIHRoZSBuZXh0IGJpbGxpbmcgY3ljbGUuIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnM6IFNvbWUgaW5zdGl0dXRpb25zIHJlcXVpcmUgYSBtaW5pbXVtIHBheW1lbnQgYWNyb3NzIGFsbCBsb2FucyBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudCBudW1iZXIuIE91ciBBUEkgcHJlc2VudHMgdGhhdCBzYW1lIG1pbmltdW0gcGF5bWVudCBhbW91bnQgb24gZWFjaCBsb2FuLiBUaGUgaW5zdGl0dXRpb25zIHRoYXQgZG8gdGhpcyBhcmU6IEdyZWF0IExha2VzICggYGluc18xMTY4NjFgKSwgRmlyc3RtYXJrIChgaW5zXzExNjI5NWApLCBDb21tb25ib25kIEZpcnN0bWFyayBTZXJ2aWNlcyAoYGluc18xMTY5NTBgKSwgTmVsbmV0IChgaW5zXzExNjUyOGApLCBFZEZpbmFuY2lhbCBTZXJ2aWNlcyAoYGluc18xMTYzMDRgKSwgR3Jhbml0ZSBTdGF0ZSAoYGluc18xMTYzMDhgKSwgYW5kIE9rbGFob21hIFN0dWRlbnQgTG9hbiBBdXRob3JpdHkgKGBpbnNfMTE2OTQ1YCkuIEZpcnN0bWFyayAoYGluc18xMTYyOTVgICkgYW5kIE5hdmllbnQgKGBpbnNfMTE2MjQ4YCkgd2lsbCBkaXNwbGF5IGFzICQwIGlmIHRoZXJlIGlzIGFuIGF1dG9wYXkgcHJvZ3JhbSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBBIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkIGlmIGBsb2FuX3N0YXR1cy50eXBlYCBpcyBgZGVmZXJtZW50YCwgYGluX3NjaG9vbGAsIGBjb25zb2xpZGF0ZWRgLCBgcGFpZCBpbiBmdWxsYCwgb3IgYHRyYW5zZmVycmVkYC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRvbGxhciBhbW91bnQgb2YgdGhlIGFjY3J1ZWQgaW50ZXJlc3QgYmFsYW5jZS4gRm9yIFNhbGxpZSBNYWUgKCBgaW5zXzExNjk0NGApLCB0aGlzIGFtb3VudCBpcyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBsb2FuLCBzbyB0aGlzIGZpZWxkIHdpbGwgcmV0dXJuIGFzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX2ludGVyZXN0X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgYWNjb3VudCBudW1iZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBsb2FuIGZvciBwYXltZW50cy4gSW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzLCBgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyYCB3aWxsIG1hdGNoIGBhY2NvdW50X251bWJlcixgIGJ1dCBpbiBzb21lIGluc3RpdHV0aW9ucywgc3VjaCBhcyBHcmVhdCBMYWtlcyAoYGluc18xMTY4NjFgKSwgaXQgd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBwYXltZW50X3JlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEludGVyZXN0T25seSA9ICdpbnRlcmVzdC1vbmx5JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGF5QXNZb3VFYXJuID0gJ3BheSBhcyB5b3UgZWFybicsXG4gICAgUmV2aXNlZFBheUFzWW91RWFybiA9ICdyZXZpc2VkIHBheSBhcyB5b3UgZWFybicsXG4gICAgU3RhbmRhcmQgPSAnc3RhbmRhcmQnLFxuICAgIFNhdmluZ09uQVZhbHVhYmxlRWR1Y2F0aW9uID0gJ3NhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvbicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzd2VlcCB0cmFuc2ZlciAgYFxcXCJwZW5kaW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3VycmVudGx5IHBlbmRpbmcgYFxcXCJwb3N0ZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiBwb3N0ZWQgYFxcXCJzZXR0bGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIHNldHRsZWQgYFxcXCJyZXR1cm5lZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHJldHVybmVkIGBcXFwiZmFpbGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGZhaWxlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSB0cmlnZ2VyIG9mIHRoZSBzd2VlcCAgYFxcXCJtYW51YWxcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBjdXN0b21lciBgXFxcImluY29taW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSBpbmNvbWluZyBmdW5kcyBmbG93IChlLmcuIEluY29taW5nIFdpcmUpIGBcXFwiYmFsYW5jZV90aHJlc2hvbGRcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGJhbGFuY2UgdGhyZXNob2xkIHNldHRpbmcgYFxcXCJhdXRvbWF0aWNfYWdncmVnYXRlXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSB0aGUgUGxhaWQgYXV0b21hdGljIGFnZ3JlZ2F0aW9uIHByb2Nlc3MuIFRoZXNlIGZ1bmRzIGRpZCBub3QgcGFzcyB0aHJvdWdoIHRoZSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN3ZWVwVHJpZ2dlciB7XG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gICAgSW5jb21pbmcgPSAnaW5jb21pbmcnLFxuICAgIEJhbGFuY2VUaHJlc2hvbGQgPSAnYmFsYW5jZV90aHJlc2hvbGQnLFxuICAgIEF1dG9tYXRpY0FnZ3JlZ2F0ZSA9ICdhdXRvbWF0aWNfYWdncmVnYXRlJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIGNoYW5nZS4gVGhpcyBjYW4gYmUgZHVlIHRvIGFueSBldmVudCByZXN1bHRpbmcgaW4gbmV3IGNoYW5nZXMsIHN1Y2ggYXMgYW4gaW5pdGlhbCAzMC1kYXkgdHJhbnNhY3Rpb25zIGZldGNoIHVwb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIEl0ZW0gd2l0aCB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZmlsbCBvZiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyB0aGF0IG9jY3VycyBzaG9ydGx5IGFmdGVyLCBvciB3aGVuIGNoYW5nZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGEgcmVndWxhcmx5LXNjaGVkdWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGpvYi4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgd2hlbiB1c2luZyB0aGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHRoZSBvbGRlciB3ZWJob29rcyBgSU5JVElBTF9VUERBVEVgLCBgSElTVE9SSUNBTF9VUERBVEVgLCBgREVGQVVMVF9VUERBVEVgLCBhbmQgYFRSQU5TQUNUSU9OU19SRU1PVkVEYCwgd2hpY2ggYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgLCB3aWxsIGFsc28gY29udGludWUgdG8gYmUgc2VudCBpbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRob3NlIHdlYmhvb2tzIHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBhbiBJdGVtLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBvbiB0aGF0IEl0ZW0uIFRoaXMgbWVhbnMgdGhhdCwgdW5saWtlIHRoZSBgSU5JVElBTF9VUERBVEVgIGFuZCBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2tzLCBpdCB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gSXRlbSBjcmVhdGlvbi4gSWYgYC90cmFuc2FjdGlvbnMvc3luY2AgaXMgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCB3YXMgKm5vdCogaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMsIHRoZSB3ZWJob29rIHdpbGwgZmlyZSB0d2ljZTogb25jZSB0aGUgZmlyc3QgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLCBhbmQgYSBzZWNvbmQgdGltZSB3aGVuIGFsbCBhdmFpbGFibGUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiAgVGhpcyB3ZWJob29rIHdpbGwgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCBhcyBpdCB3b3VsZCBpbiBQcm9kdWN0aW9uLiBJdCBjYW4gYWxzbyBiZSBtYW51YWxseSB0cmlnZ2VyZWQgaW4gU2FuZGJveCBieSBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gKG1vc3QgcmVjZW50IDMwIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIChtYXhpbXVtIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLCB1cCB0byAyIHllYXJzKSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgYW4gb2ZmaWNpYWwgZG9jdW1lbnQgdXNlZCB0byByZXBvcnQgdGhlIHVzZXJcXCdzIGluY29tZSB0byB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhmb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4Zm9ybSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0YXggZG9jdW1lbnQuIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGB3MmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VzJ9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICB3Mj86IFcyO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySURcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExhc3QgNCBkaWdpdHMgb2YgdW5pcXVlIG51bWJlciBvZiBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsYXN0XzRfZGlnaXRzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySWRlbnRpZmllclxuICAgICAqL1xuICAgIFRheHBheWVySWRlbnRpZmllclR5cGU6IFRheHBheWVySWRlbnRpZmllclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGF4cGF5ZXIgaWRlbnRpZmllciBhcyBhc3NpZ25lZCBieSB0aGUgSVJTIHRvIHRoZSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJWYWx1ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgY2xhc3NpZmllcyBpZGVudGlmaWNhdGlvbiBudW1iZXJzIHVzZWQgYnkgdGhlIEludGVybmFsIFJldmVudWUgU2VydmljZSAoSVJTKSBpbiB0aGUgYWRtaW5pc3RyYXRpb24gb2YgdGF4IGxhd3MuIEEgU29jaWFsIFNlY3VyaXR5IG51bWJlciAoU1NOKSBpcyBpc3N1ZWQgYnkgdGhlIFNTQTsgYWxsIG90aGVyIHRheHBheWVyIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgYXJlIGlzc3VlZCBieSB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVGF4cGF5ZXJJZGVudGlmaWVyVHlwZSB7XG4gICAgSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXIgPSAnSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXInLFxuICAgIFNvY2lhbFNlY3VyaXR5TnVtYmVyID0gJ1NvY2lhbFNlY3VyaXR5TnVtYmVyJ1xufVxuXG4vKipcbiAqIFRoZSBjb2xsZWN0aW9uIG9mIFRBWFBBWUVSX0lERU5USUZJQ0FUSU9OIGVsZW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJzXG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUjogVGF4cGF5ZXJJZGVudGlmaWVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYSBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb259XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogVG90YWxDYW5vbmljYWxEZXNjcmlwdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGV4dCBvZiB0aGUgbGluZSBpdGVtIGFzIHByaW50ZWQgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgRW1wbG95ZWVNZWRpY2FyZSA9ICdFTVBMT1lFRSBNRURJQ0FSRScsXG4gICAgRmljYSA9ICdGSUNBJyxcbiAgICBTb2NpYWxTZWN1cml0eUVtcGxveWVlVGF4ID0gJ1NPQ0lBTCBTRUNVUklUWSBFTVBMT1lFRSBUQVgnLFxuICAgIE1lZGljYWwgPSAnTUVESUNBTCcsXG4gICAgVmlzaW9uID0gJ1ZJU0lPTicsXG4gICAgRGVudGFsID0gJ0RFTlRBTCcsXG4gICAgTmV0UGF5ID0gJ05FVCBQQVknLFxuICAgIFRheGVzID0gJ1RBWEVTJyxcbiAgICBOb3RGb3VuZCA9ICdOT1RfRk9VTkQnLFxuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YTogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRlYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRlYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRldGltZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRldGltZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRldGltZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBUaGlzIGZpZWxkIHJlcGxhY2VzIHRoZSBgdHJhbnNhY3Rpb25fdHlwZWAgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBUcmFuc2FjdGlvblBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBtZXJjaGFudF9lbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQWxsT2ZQYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGNsYXNzaWZ5aW5nIHRoZSB0cmFuc2FjdGlvbiB0eXBlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhLCB0aGlzIGZpZWxkIGlzIHNldCB0byBgbnVsbGAuICBgYWRqdXN0bWVudDpgIEJhbmsgYWRqdXN0bWVudCAgYGF0bTpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsIHZpYSBhbiBhdXRvbWF0ZWQgdGVsbGVyIG1hY2hpbmUgIGBiYW5rIGNoYXJnZTpgIENoYXJnZSBvciBmZWUgbGV2aWVkIGJ5IHRoZSBpbnN0aXR1dGlvbiAgYGJpbGwgcGF5bWVudGA6IFBheW1lbnQgb2YgYSBiaWxsICBgY2FzaDpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsICBgY2FzaGJhY2s6YCBDYXNoIHdpdGhkcmF3YWwgd2hpbGUgbWFraW5nIGEgZGViaXQgY2FyZCBwdXJjaGFzZSAgYGNoZXF1ZTpgIERvY3VtZW50IG9yZGVyaW5nIHRoZSBwYXltZW50IG9mIG1vbmV5IHRvIGFub3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiAgYGRpcmVjdCBkZWJpdDpgIEF1dG9tYXRpYyB3aXRoZHJhd2FsIG9mIGZ1bmRzIGluaXRpYXRlZCBieSBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYGludGVyZXN0OmAgSW50ZXJlc3QgZWFybmVkIG9yIGluY3VycmVkICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHN0YW5kaW5nIG9yZGVyOmAgUGF5bWVudCBpbnN0cnVjdGVkIGJ5IHRoZSBhY2NvdW50IGhvbGRlciB0byBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYHRyYW5zZmVyOmAgVHJhbnNmZXIgb2YgbW9uZXkgYmV0d2VlbiBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25Db2RlIHtcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEF0bSA9ICdhdG0nLFxuICAgIEJhbmtDaGFyZ2UgPSAnYmFuayBjaGFyZ2UnLFxuICAgIEJpbGxQYXltZW50ID0gJ2JpbGwgcGF5bWVudCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgUHVyY2hhc2UgPSAncHVyY2hhc2UnLFxuICAgIFN0YW5kaW5nT3JkZXIgPSAnc3RhbmRpbmcgb3JkZXInLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvdW50ZXJwYXJ0eSBpcyBpbnZvbHZlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBgVkVSWV9ISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY291bnRlcnBhcnR5IHdhcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBidXQgc29tZSBkZXRhaWxzIG1heSBkaWZmZXIgZnJvbSBvdXIgcmVjb3Jkcy4gYExPV2A6IFdlIGRpZG7igJl0IGZpbmQgYSBtYXRjaGluZyBjb3VudGVycGFydHkgaW4gb3VyIHJlY29yZHMsIHNvIHdlIGFyZSByZXR1cm5pbmcgYSBjbGVhbnNlZCBuYW1lIHBhcnNlZCBvdXQgb2YgdGhlIHJlcXVlc3QgZGVzY3JpcHRpb24uIGBVTktOT1dOYDogV2UgZG9u4oCZdCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hlZCBkaXJlY3QgZGVwb3NpdCB0cmFuc2FjdGlvbiB1c2VkIHRvIHZlcmlmeSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIHRvIHBvcHVsYXRlIGFzIHRlc3QgdHJhbnNhY3Rpb24gZGF0YS4gSWYgbm90IHNwZWNpZmllZCwgcmFuZG9tIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC4gSWYgYSBgZGF0ZV90cmFuc2FjdGVkYCBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBhIHRyYW5zYWN0aW9uIGRhdGUgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgW2BhdXRob3JpemVkX2RhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9ucy1nZXQtcmVzcG9uc2UtdHJhbnNhY3Rpb25zLWF1dGhvcml6ZWQtZGF0ZSkgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFBvc3RlZCBkYXRlcyBpbiB0aGUgcGFzdCBvciBwcmVzZW50IHdpbGwgcmVzdWx0IGluIHBvc3RlZCB0cmFuc2FjdGlvbnM7IHBvc3RlZCBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogQSBncm91cGluZyBvZiByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZmlyc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZnJlcXVlbmN5OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCB0cmFuc2FjdGlvbiBJRHMgYmVsb25naW5nIHRvIHRoZSBzdHJlYW0sIHNvcnRlZCBieSBwb3N0ZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbGFzdF9hbW91bnQ6IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0gaXMgc3RpbGwgbGl2ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc19hY3RpdmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyB3aWxsIGJlIHNldCB0byBgdHJ1ZWAgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBtb2RpZmllZCBieSByZXF1ZXN0IHRvIGEgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXNgIGVuZHBvaW50LiBJdCB3aWxsIGJlIGBmYWxzZWAgZm9yIGFsbCBvdGhlciBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGlzX3VzZXJfbW9kaWZpZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50IHVzZXIgbW9kaWZpY2F0aW9uLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgaWYgYGlzX3VzZXJfbW9kaWZpZWRgIGlzIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfdXNlcl9tb2RpZmllZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IHdpdGggZGF0YSBwZXJ0YWluaW5nIHRvIGFuIGFtb3VudCBvbiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIHRoZSBudW1lcmljYWwgdmFsdWUgb2YgYW4gYW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uICBgTUFUVVJFYDogQSBgTUFUVVJFYCByZWN1cnJpbmcgc3RyZWFtIHNob3VsZCBoYXZlIGF0IGxlYXN0IDMgdHJhbnNhY3Rpb25zIGFuZCBoYXBwZW4gb24gYSByZWd1bGFyIGNhZGVuY2UgKEZvciBBbm51YWwgcmVjdXJyaW5nIHN0cmVhbSwgd2Ugd2lsbCBtYXJrIGl0IGBNQVRVUkVgIGFmdGVyIDIgaW5zdGFuY2VzKS4gIGBFQVJMWV9ERVRFQ1RJT05gOiBXaGVuIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIGZpcnN0IGFwcGVhcnMgaW4gdGhlIHRyYW5zYWN0aW9uIGhpc3RvcnkgYW5kIGJlZm9yZSBpdCBmdWxmaWxscyB0aGUgcmVxdWlyZW1lbnQgb2YgYSBtYXR1cmUgc3RyZWFtLCB0aGUgc3RhdHVzIHdpbGwgYmUgYEVBUkxZX0RFVEVDVElPTmAuICBgVE9NQlNUT05FRGA6IEEgc3RyZWFtIHRoYXQgd2FzIHByZXZpb3VzbHkgaW4gdGhlIGBFQVJMWV9ERVRFQ1RJT05gIHN0YXR1cyB3aWxsIG1vdmUgdG8gdGhlIGBUT01CU1RPTkVEYCBzdGF0dXMgd2hlbiBubyBmdXJ0aGVyIHRyYW5zYWN0aW9ucyB3ZXJlIGZvdW5kIGF0IHRoZSBuZXh0IGV4cGVjdGVkIGRhdGUuICBgVU5LTk9XTmA6IEEgc3RyZWFtIGlzIGFzc2lnbmVkIGFuIGBVTktOT1dOYCBzdGF0dXMgd2hlbiBub25lIG9mIHRoZSBvdGhlciBzdGF0dXNlcyBhcmUgYXBwbGljYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIE1hdHVyZSA9ICdNQVRVUkUnLFxuICAgIEVhcmx5RGV0ZWN0aW9uID0gJ0VBUkxZX0RFVEVDVElPTicsXG4gICAgVG9tYnN0b25lZCA9ICdUT01CU1RPTkVEJ1xufVxuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvbnMgY2F0ZWdvcnkgcnVsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBydWxlIGNyZWF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBJdGVtIHRoZSBydWxlIHdhcyBjcmVhdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHJ1bGUgd2FzIGNyZWF0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdW5pcXVlIGlkZW50aWZpZXIuICBJbiB0aGUgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSB0YXhvbm9teSwgdGhpcyBmaWVsZCBpcyByZXByZXNlbnRlZCBieSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBydWxlX2RldGFpbHM/OiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9ucyAoYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJhdyB0cmFuc2FjdGlvbnMgdG8gYmUgZW5oYW5jZWQuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZW5oYW5jZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmhhbmNlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbnMgKGVpdGhlciBgZGVwb3NpdG9yeWAgb3IgYGNyZWRpdGApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbiBvYmplY3RzIHRvIGJlIGVucmljaGVkIGJ5IFBsYWlkLiBNYXhpbXVtIG9mIDEwMCB0cmFuc2FjdGlvbnMgcGVyIHJlcXVlc3QuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYGxlZ2FjeV9jYXRlZ29yeWAgYW5kIGBsZWdhY3lfY2F0ZWdvcnlfaWRgIGluIHRoZSByZXNwb25zZSAoaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgKS4gIENhdGVnb3JpZXMgYXJlIGJhc2VkIG9uIFBsYWlkXFwncyBsZWdhY3kgdGF4b25vbXkuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xlZ2FjeV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVucmljaGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnJpY2hlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbSAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciwgb3Igc3VibWl0IGEgW1N1cHBvcnQgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3Byb2R1Y3QtZnVuY3Rpb25hbGl0eSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgdG8gY2FsbHMgZm9yIEl0ZW1zIHRoYXQgd2VyZSBub3QgaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgZHVyaW5nIExpbmsgYW5kIGFyZSBub3cgYWRkaW5nIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCB0byB0aGUgSXRlbSBmb3IgdGhlIGZpcnN0IHRpbWUuIEluIHRoZXNlIGNhc2VzLCB0aGlzIG9wdGlvbiBjb250cm9scyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRoYXQgUGxhaWQgd2lsbCByZXF1ZXN0IGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIGFmdGVyIERlY2VtYmVyIDMsIDIwMjMsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIG9uIERlY2VtYmVyIDMsIDIwMjMgb3IgZWFybGllciwgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA3MzAgZGF5cyB1bnRpbCBKdW5lIDI0LCAyMDI0LCBhdCB3aGljaCBwb2ludCBpdCB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gIElmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHByaW9yIHRvIHRoaXMgY2FsbCwgdGhpcyBmaWVsZCB3aWxsIGhhdmUgbm8gZWZmZWN0LiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgY3VzdG9tZXJzIHV0aWxpemluZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbSAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQge1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBmaXJzdCBzdHJlYW0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmV0YWluIHRoZSBzdHJlYW1faWQgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRyYW5zYWN0aW9ucyBydWxlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgZGV0YWlsZWQgY2F0ZWdvcnkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGFuZCBhY2N1cmF0ZSBjYXRlZ29yaXphdGlvbi4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbiBydWxlc1xuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzOiBBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBUaGUgY3Vyc29yIGFsc28gYWNjZXB0cyB0aGUgc3BlY2lhbCB2YWx1ZSBvZiBgXFxcIm5vd1xcXCJgLCB3aGljaCBjYW4gYmUgdXNlZCB0byBmYXN0LWZvcndhcmQgdGhlIGN1cnNvciBhcyBwYXJ0IG9mIG1pZ3JhdGluZyBhbiBleGlzdGluZyBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBzeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBgXFxcIm5vd1xcXCJgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSB1c2UgY2FzZSBvdGhlciB0aGFuIG1pZ3JhdGluZyBleGlzdGluZyBJdGVtcyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAuICBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIGZpZWxkIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIElmIHlvdSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHBhcnNlZCBkYXRhIHByb3ZpZGVkLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyIG9yIHN1Ym1pdCBhIFtTdXBwb3J0IHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9wcm9kdWN0LWZ1bmN0aW9uYWxpdHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB0byBjYWxscyBmb3IgSXRlbXMgdGhhdCB3ZXJlIG5vdCBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyBkdXJpbmcgTGluayBhbmQgYXJlIG5vdyBhZGRpbmcgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IHRvIHRoZSBJdGVtIGZvciB0aGUgZmlyc3QgdGltZS4gSW4gdGhlc2UgY2FzZXMsIHRoaXMgb3B0aW9uIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgYWZ0ZXIgRGVjZW1iZXIgMywgMjAyMywgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgb24gRGVjZW1iZXIgMywgMjAyMyBvciBlYXJsaWVyLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDczMCBkYXlzIHVudGlsIEp1bmUgMjQsIDIwMjQsIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiAgSWYgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gcHJpb3IgdG8gdGhpcyBjYWxsLCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuICBXZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCBjdXN0b21lcnMgdXRpbGl6aW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IGZvciBvcHRpbWFsIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyBleGlzdC4gSWYgdHJ1ZSwgdGhlIGFkZGl0aW9uYWwgdXBkYXRlcyBjYW4gYmUgZmV0Y2hlZCBieSBtYWtpbmcgYW4gYWRkaXRpb25hbCByZXF1ZXN0IHdpdGggYGN1cnNvcmAgc2V0IHRvIGBuZXh0X2N1cnNvcmAuIElmIGBoYXNfbW9yZWAgaXMgdHJ1ZSwgaXTigJlzIGltcG9ydGFudCB0byBwdWxsIGFsbCBhdmFpbGFibGUgcGFnZXMsIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgZm9yIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzIHRvIGNvbmZsaWN0IHdpdGggcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgY2xpZW50LXByb3ZpZGVkIHVzZXJfaWQgdG8gcmV0cmlldmUgaW5zaWdodHMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckRhdGFPdmVydmlld31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2RhdGFfb3ZlcnZpZXc6IFVzZXJEYXRhT3ZlcnZpZXc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9pbnNpZ2h0cz86IENvdW50ZXJwYXJ0eUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXRlZ29yeUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3J5X2luc2lnaHRzPzogQ2F0ZWdvcnlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2FjdGlvbnM/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbnM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiB0aGUgZnVsbCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIHNldHRsZXMgYXQgdGhlIGNvbnN1bWVyc+KAmSBhY2NvdW50LCBpZiB0aGUgdHJhbnNmZXIgaXMgY3JlZGl0OyBvciBhdCB0aGUgY3VzdG9tZXJcXCdzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQsIGlmIHRoZSB0cmFuc2ZlciBpcyBkZWJpdC4gT25seSBzZXQgZm9yIEFDSCB0cmFuc2ZlcnMgYW5kIGlzIG51bGwgZm9yIG5vbi1BQ0ggdHJhbnNmZXJzLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIEFDSCBuZXR3b3JrcyB1c2VkIGZvciB0aGUgZnVuZHMgZmxvdy4gIEZvciByZXF1ZXN0cyBzdWJtaXR0ZWQgYXMgZWl0aGVyIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRoZSBjdXRvZmYgZm9yIHNhbWUtZGF5IGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lIGFuZCB0aGUgY3V0b2ZmIGZvciBuZXh0LWRheSB0cmFuc2ZlcnMgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHN1Ym1pdCBhIHJlcXVlc3QgYXQgbGVhc3QgMTUgbWludXRlcyBiZWZvcmUgdGhlIGN1dG9mZiB0aW1lIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgY3V0b2ZmLiBBbnkgcmVxdWVzdCB0aGF0IGlzIGluZGljYXRlZCBhcyBgc2FtZS1kYXktYWNoYCBhbmQgdGhhdCBtaXNzZXMgdGhlIHNhbWUtZGF5IGN1dG9mZiwgYnV0IGlzIHN1Ym1pdHRlZCBpbiB0aW1lIGZvciB0aGUgbmV4dC1kYXkgY3V0b2ZmLCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQUNITmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gZm9yIGEgcHJvcG9zZWQgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbiB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgcmVwcmVzZW50aW5nIHdoZW4gdGhlIGF1dGhvcml6YXRpb24gd2FzIGNyZWF0ZWQsIGluIHRoZSBmb3JtYXQgYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrOiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJlcXVpcmVkIGlmIG5vdCB1c2luZyBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgVGhpcyBpZGVtcG90ZW5jeSBrZXkgZXhwaXJlcyBhZnRlciA0OCBob3VycywgYWZ0ZXIgd2hpY2ggdGhlIHNhbWUga2V5IGNhbiBiZSByZXVzZWQuIEZhaWx1cmUgdG8gcHJvdmlkZSB0aGlzIGtleSBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBjaGFyZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC4gVGhpcyBmaWVsZCBpcyBub3QgY3VycmVudGx5IHVzZWQgYW5kIGlzIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAsIFBsYWlkIHdpbGwgbm90IG9mZmVyIGEgYGd1YXJhbnRlZV9kZWNpc2lvbmAgZm9yIHRoaXMgcmVxdWVzdCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdpdGhfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIHJldHVybmVkIGJ5IFBsYWlkXFwncyBbYmVhY29uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2d1YXJhbnRlZS8jdXNpbmctYS1iZWFjb24pIHdoZW4gaXQgaXMgcnVuIG9uIHlvdXIgd2VicGFnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IG5lZWRlZCBpZiBjcmVhdGluZyB0cmFuc2ZlcnMgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U/OiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYGF1dGhvcml6YXRpb25gIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgZGVjbGluZWRgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRGVjbGluZWQgPSAnZGVjbGluZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIHNhbWUtZGF5IG1pY3JvIGRlcG9zaXRzLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIEl0ZW0gc3RhbGVuZXNzLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgYE1JR1JBVEVEX0FDQ09VTlRfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGAvdHJhbnNmZXIvYWNjb3VudF9taWdyYXRpb25gIGVuZHBvaW50LCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBFUlJPUmAg4oCTIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIGR1ZSB0byBhbiB1bnNwZWNpZmllZCBlcnJvci4gIFRoZSBmb2xsb3dpbmcgY29kZXMgaW5kaWNhdGUgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiB3YXMgYGRlY2xpbmVkYDogIGBOU0ZgIOKAkyBUcmFuc2FjdGlvbiBsaWtlbHkgdG8gcmVzdWx0IGluIGEgcmV0dXJuIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUklTS2AgLSBUcmFuc2FjdGlvbiBpcyBoaWdoLXJpc2suICBgVFJBTlNGRVJfTElNSVRfUkVBQ0hFRGAgLSBPbmUgb3Igc2V2ZXJhbCB0cmFuc2ZlciBsaW1pdHMgYXJlIHJlYWNoZWQsIGUuZy4gbW9udGhseSB0cmFuc2ZlciBsaW1pdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgTnNmID0gJ05TRicsXG4gICAgUmlzayA9ICdSSVNLJyxcbiAgICBUcmFuc2ZlckxpbWl0UmVhY2hlZCA9ICdUUkFOU0ZFUl9MSU1JVF9SRUFDSEVEJyxcbiAgICBNYW51YWxseVZlcmlmaWVkSXRlbSA9ICdNQU5VQUxMWV9WRVJJRklFRF9JVEVNJyxcbiAgICBJdGVtTG9naW5SZXF1aXJlZCA9ICdJVEVNX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBQYXltZW50UHJvZmlsZUxvZ2luUmVxdWlyZWQgPSAnUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgTWlncmF0ZWRBY2NvdW50SXRlbSA9ICdNSUdSQVRFRF9BQ0NPVU5UX0lURU0nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uIFRoZXNlIGZpZWxkcyBhcmUgbm90IGN1cnJlbnRseSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZztcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIGlzIGd1YXJhbnRlZWQgYnkgUGxhaWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuIFRoaXMgZmllbGQgd2lsbCBjb250YWluIGVpdGhlciBgR1VBUkFOVEVFRGAgb3IgYE5PVF9HVUFSQU5URUVEYCBpbmRpY2F0aW5nIHdoZXRoZXIgUGxhaWQgd2lsbCBndWFyYW50ZWUgdGhlIHRyYW5zZmVyLiBJZiB0aGUgdHJhbnNmZXIgaXMgbm90IGd1YXJhbnRlZWQsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUgYGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIGBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlYCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHtcbiAgICBHdWFyYW50ZWVkID0gJ0dVQVJBTlRFRUQnLFxuICAgIE5vdEd1YXJhbnRlZWQgPSAnTk9UX0dVQVJBTlRFRUQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gdG8gbm90IGd1YXJhbnRlZSBhIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCB1bmxlc3MgYGd1YXJhbnRlZV9kZWNpc2lvbmAgaXMgYE5PVF9HVUFSQU5URUVEYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBjb2RlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIHRyYW5zZmVyIGNhbm5vdCBiZSBndWFyYW50ZWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIFBsYWlkIGRlY2xpbmVkIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyOiAgYFJFVFVSTl9CQU5LYDogVGhlIHJpc2sgb2YgYSBiYW5rLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhbiBSMDEvTlNGKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBSRVRVUk5fQ1VTVE9NRVJgOiBUaGUgcmlzayBvZiBhIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhIFIxMC9VbmF1dGhvcml6ZWQpIGlzIHRvbyBoaWdoIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyLiAgYEdVQVJBTlRFRV9MSU1JVF9SRUFDSEVEYDogVGhpcyB0cmFuc2ZlciBpcyBsb3ctcmlzaywgYnV0IEd1YXJhbnRlZSBoYXMgZXhoYXVzdGVkIGFuIGludGVybmFsIGxpbWl0IG9uIHRoZSBudW1iZXIgb3IgcmF0ZSBvZiBndWFyYW50ZWVzIHRoYXQgYXBwbGllcyB0byB0aGlzIHRyYW5zZmVyLiAgYFJJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEVgOiBBIHJpc2sgZXN0aW1hdGUgaXMgdW5hdmFpbGFibGUgZm9yIHRoaXMgSXRlbS4gIGBSRVFVSVJFRF9QQVJBTV9NSVNTSU5HYDogUmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBSZXR1cm5CYW5rID0gJ1JFVFVSTl9CQU5LJyxcbiAgICBSZXR1cm5DdXN0b21lciA9ICdSRVRVUk5fQ1VTVE9NRVInLFxuICAgIEd1YXJhbnRlZUxpbWl0UmVhY2hlZCA9ICdHVUFSQU5URUVfTElNSVRfUkVBQ0hFRCcsXG4gICAgUmlza0VzdGltYXRlVW5hdmFpbGFibGUgPSAnUklTS19FU1RJTUFURV9VTkFWQUlMQUJMRScsXG4gICAgUmVxdWlyZWRQYXJhbU1pc3NpbmcgPSAnUkVRVUlSRURfUEFSQU1fTUlTU0lORydcbn1cblxuLyoqXG4gKiBUaGlzIG9iamVjdCBpbmNsdWRlcyB0aGUgc2NvcmVzIGFuZCByaXNrIGxldmVsLiBUaGlzIHJlc3BvbnNlIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhlc2UgZmllbGRzIHBsZWFzZSBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuICBUaGUgc2NvcmUgZXZhbHVhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQgYW5kIGNvdmVycyByZXR1cm4gY29kZXM6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICBiYW5rX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0IGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjA1XFxcIiwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIHRoZSBjdXN0b21lciBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9zY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U6IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG59XG4vKipcbiAqIENvbXByaXNlcyBmaXZlIHJpc2sgY2F0ZWdvcmllcyAoaGlnaCByaXNrLCBtZWRpdW0taGlnaCByaXNrLCBtZWRpdW0gcmlzaywgbWVkaXVtLWxvdyByaXNrLCBsb3cgcmlzaykgYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IG9mIHJldHVyblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsIHtcbiAgICBIaWdoUmlzayA9ICdISUdIX1JJU0snLFxuICAgIE1lZGl1bUhpZ2hSaXNrID0gJ01FRElVTV9ISUdIX1JJU0snLFxuICAgIE1lZGl1bVJpc2sgPSAnTUVESVVNX1JJU0snLFxuICAgIE1lZGl1bUxvd1Jpc2sgPSAnTUVESVVNX0xPV19SSVNLJyxcbiAgICBMb3dSaXNrID0gJ0xPV19SSVNLJ1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLiBUaGUgYHVzZXIubGVnYWxfbmFtZWAgZmllbGQgaXMgcmVxdWlyZWQuIE90aGVyIGZpZWxkcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGFuZCBhcmUgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS4gSWYgdGhlIHVzZXIgaXMgYSBidXNpbmVzcywgcHJvdmlkZSB0aGUgYnVzaW5lc3MgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UsIHBsdXMgYW1vdW50IG9mIHBlbmRpbmcgZnVuZHMgdGhhdCBpbiBwcm9jZXNzaW5nIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJCYWxhbmNlVHlwZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYWxhbmNlLiAgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFlvdXIgcHJlZnVuZGVkIEFDSCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckJhbGFuY2VUeXBlIHtcbiAgICBSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyB0aGUgc3VwcG9ydGVkIHNlcnZpY2UgdHlwZXMgaW4gUlRQXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFAge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgbGlua2VkIEl0ZW1cXCdzIGluc3RpdHV0aW9uIHN1cHBvcnRzIFJUUCBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gICAgICovXG4gICAgY3JlZGl0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3N1cHBvcnRlZF9uZXR3b3JrczogSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIGBhdXRob3JpemF0aW9uX2lkYCBpcyBub3cgdXNlZCBhcyBpZGVtcG90ZW5jeSBpbnN0ZWFkLiAgQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gVGhpcyBwYXJhbWV0ZXIgYWxzbyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgYWN0aW5nIGFzIGFuIGlkZW1wb3RlbmN5IGlkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuIElmIHJlcHJvY2Vzc2luZyBhIHJldHVybmVkIHRyYW5zZmVyLCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIG11c3QgYmUgYFxcXCJSZXRyeSAxXFxcImAgb3IgYFxcXCJSZXRyeSAyXFxcImAgdG8gaW5kaWNhdGUgdGhhdCBpdFxcJ3MgYSByZXRyeSBvZiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdHJhbnNmZXIuIFlvdSBtYXkgcmV0cnkgYSB0cmFuc2ZlciB1cCB0byAyIHRpbWVzLCB3aXRoaW4gMTgwIGRheXMgb2YgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHRyYW5zZmVyLiBPbmx5IHRyYW5zZmVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2l0aCBjb2RlIGBSMDFgIG9yIGBSMDlgIG1heSBiZSByZXRyaWVkLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyPzogVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYHRyYW5zZmVyYCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gZGVkdWN0IGZyb20gYHRyYW5zZmVyLmFtb3VudGAgYW5kIGRpc3RyaWJ1dGUgdG8gdGhlIHBsYXRmb3Jt4oCZcyBMZWRnZXIgYmFsYW5jZSBhcyBhIGZhY2lsaXRhdG9yIGZlZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGUgcmVtYWluZGVyIHdpbGwgZ28gdG8gdGhlIGVuZC1jdXN0b21lcuKAmXMgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGB0cmFuc2Zlci5hbW91bnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBub3cgZGVwcmVjYXRlZC4gWW91IG1heSBpZ25vcmUgaXQgZm9yIHRyYW5zZmVycyBjcmVhdGVkIG9uIGFuZCBhZnRlciAxMi8wMS8yMDIzLiAgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgZnVuZHMgZm9yIHRoZSB0cmFuc2Zlci4gT25seSB2YWxpZCBmb3IgYGNyZWRpdGAgdHJhbnNmZXJzLCBhbmQgZGVmYXVsdHMgdG8gYHN3ZWVwYCBpZiBub3Qgc3BlY2lmaWVkLiBUaGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBkZWJpdGAgdHJhbnNmZXJzLiAgYHN3ZWVwYCAtIFN3ZWVwIGZ1bmRzIGZyb20geW91ciBmdW5kaW5nIGFjY291bnQgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2Uge1xuICAgIFN3ZWVwID0gJ3N3ZWVwJyxcbiAgICBQcmVmdW5kZWRSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgUHJlZnVuZGVkQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGNyZWRpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgY3JlZGl0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9oaWdoZXN0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBhdmVyYWdlIGFtb3VudCBwZXIgY3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgbW9udGhseSBleHBlY3RlZCBBQ0ggY3JlZGl0IHByb2Nlc3NpbmcgYW1vdW50IGZvciB0aGUgbmV4dCA2LTEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBjcmVkaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZS5nLiBiaWxsIHBheW1lbnQgIGBcXFwid2ViXFxcImAgLSBBIGNyZWRpdCBFbnRyeSBpbml0aWF0ZWQgYnkgb3Igb24gYmVoYWxmIG9mIGEgaG9sZGVyIG9mIGEgQ29uc3VtZXIgQWNjb3VudCB0aGF0IGlzIGludGVuZGVkIGZvciBhIENvbnN1bWVyIEFjY291bnQgb2YgYSBSZWNlaXZlclxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxDcmVkaXRBQ0hDbGFzcz47XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgZGViaXRzLiBGb3IgYWxsIGRvbGxhciBhbW91bnRzLCB1c2UgYSBkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiB0aGUgb3JpZ2luYXRvciBpcyBleHBlY3RlZCB0byBwcm9jZXNzIGRlYml0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBkZWJpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGRlYml0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBkZWJpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBkZWJpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRvY3VtZW50IHRoYXQgeW91IHdhbnQgdG8gdXBsb2FkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZpbGUgdG8gdXBsb2FkLiBUaGUgZmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuIDIwTUIuIFN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnM6IC5wZGYuXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBmaWxlOiBhbnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRG9jdW1lbnRQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHB1cnBvc2U6IFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9y4oCZcyBkaWxpZ2VuY2Ugc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXMge1xuICAgIE5vdFN1Ym1pdHRlZCA9ICdub3Rfc3VibWl0dGVkJyxcbiAgICBTdWJtaXR0ZWQgPSAnc3VibWl0dGVkJyxcbiAgICBVbmRlclJldmlldyA9ICd1bmRlcl9yZXZpZXcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZW5pZWQgPSAnZGVuaWVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRpbGlnZW5jZSB0aGF0IHlvdSB3YW50IHRvIHN1Ym1pdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfZGlsaWdlbmNlOiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS4gIGBcXFwiRFVFX0RJTElHRU5DRVxcXCJgIC0gVGhlIHRyYW5zZmVyIGR1ZSBkaWxpZ2VuY2UgZG9jdW1lbnQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRvY3VtZW50UHVycG9zZSB7XG4gICAgRHVlRGlsaWdlbmNlID0gJ0RVRV9ESUxJR0VOQ0UnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBgbnVsbGAgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T21pdHRhYmxlVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IE9taXR0YWJsZVRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2Ftb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNpZ25lZCBhbW91bnQgb2YgaG93IG11Y2ggd2FzIGBzd2VwdGAgb3IgYHJldHVybl9zd2VwdGAgZm9yIHRoaXMgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiLTUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfYW1vdW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzIHRoZSBldmVudCBpcyBmb3IgdGhlIGFzc29jaWF0ZWQgcmVmdW5kIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGUgdHJhbnNmZXIgdGhhdCB0aGlzIGV2ZW50IGFwcGxpZXMgdG8uIE9ubHkgcHJlc2VudCBpZiB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PFRyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIHRyYW5zZmVyIHJlcHJlc2VudHMuIEV2ZW50IHR5cGVzIHdpdGggcHJlZml4IGBzd2VlcGAgcmVwcmVzZW50cyBldmVudHMgZm9yIFBsYWlkIExlZGdlciBzd2VlcHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGBzZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLiAgYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlcHRfc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBjdXN0b21lcuKAmXMgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudC4gIGByZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHRyYW5zZmVyIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBmcm9tIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiAgYHN3ZWVwLnBlbmRpbmdgOiBBIG5ldyBsZWRnZXIgc3dlZXAgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHN3ZWVwLnBvc3RlZGA6IFRoZSBsZWRnZXIgc3dlZXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHN3ZWVwLnNldHRsZWRgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIGZ1bmRpbmcgYWNjb3VudC4gVGhpcyBtZWFucyB0aGF0IGZ1bmRzIHdpdGhkcmF3biBmcm9tIFBsYWlkIExlZGdlciBiYWxhbmNlIGhhdmUgcmVhY2hlZCB0aGUgZnVuZGluZyBhY2NvdW50LCBvciBmdW5kcyB0byBiZSBkZXBvc2l0ZWQgaW50byB0aGUgUGxhaWQgTGVkZ2VyIEJhbGFuY2UgaGF2ZSBiZWVuIHB1bGxlZCwgYW5kIHRoZSBob2xkIHBlcmlvZCBoYXMgYmVndW4uICBgc3dlZXAucmV0dXJuZWRgOiBBIHBvc3RlZCBsZWRnZXIgc3dlZXAgd2FzIHJldHVybmVkLiAgYHN3ZWVwLmZhaWxlZGA6IFRoZSBsZWRnZXIgc3dlZXAgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wZW5kaW5nYDogQSBuZXcgcmVmdW5kIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGByZWZ1bmQuY2FuY2VsbGVkYDogVGhlIHJlZnVuZCB3YXMgY2FuY2VsbGVkLiAgYHJlZnVuZC5mYWlsZWRgOiBUaGUgcmVmdW5kIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGByZWZ1bmQucG9zdGVkYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmVmdW5kLnNldHRsZWRgOiBUaGUgcmVmdW5kIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGluIHRoZSBQbGFpZCBsaW5rZWQgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuZWRgOiBBIHBvc3RlZCByZWZ1bmQgd2FzIHJldHVybmVkLiAgYHJlZnVuZC5zd2VwdGA6IFRoZSByZWZ1bmQgd2FzIHN3ZXB0IGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgcmVmdW5kLnJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgcmVmdW5kIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgU3dlcHQgPSAnc3dlcHQnLFxuICAgIFN3ZXB0U2V0dGxlZCA9ICdzd2VwdF9zZXR0bGVkJyxcbiAgICBSZXR1cm5Td2VwdCA9ICdyZXR1cm5fc3dlcHQnLFxuICAgIFN3ZWVwUGVuZGluZyA9ICdzd2VlcC5wZW5kaW5nJyxcbiAgICBTd2VlcFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFN3ZWVwU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBTd2VlcFJldHVybmVkID0gJ3N3ZWVwLnJldHVybmVkJyxcbiAgICBTd2VlcEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIGFuIGV4cGVjdGVkIHN3ZWVwIGRhdGUgYW5kIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVtZW50IGRhdGUgb2YgYSBzd2VlcCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlZXBfc2V0dGxlbWVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY3VtdWxhdGVkIGFtb3VudCB0aGF0IGhhcyBiZWVuIHN3ZXB0IGJ5IGBzd2VlcF9zZXR0bGVtZW50X2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VwdF9zZXR0bGVkX2Ftb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgQVBQUk9WRURgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgREVDTElORURgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50QXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGUge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmV0dXJuZWQgb25seSBpZiBgYWNjb3VudF9pZGAgd2FzIHNldCBvbiBpbnRlbnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdyBvZiB0cmFuc2ZlciBmdW5kcy4gIGBQQVlNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQgdG8geW91ciBidXNpbmVzcyBhY2NvdW50LiAgYERJU0JVUlNFTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIHlvdXIgYnVzaW5lc3MgYWNjb3VudCB0byBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZSB7XG4gICAgUGF5bWVudCA9ICdQQVlNRU5UJyxcbiAgICBEaXNidXJzZW1lbnQgPSAnRElTQlVSU0VNRU5UJ1xufVxuXG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gRGVmYXVsdHMgdG8gYHNhbWUtZGF5LWFjaGAuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA1OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBTaG91bGQgYmUgc3BlY2lmaWVkIGlmIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMgb25seS4gSWYgdXNpbmcgUGxhaWQgTGVkZ2VyLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBhbmQgeW91IGFyZSB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIE90aGVyd2lzZSwgUGxhaWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1vZGU6IFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgOCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudENyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlckludGVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBjcmVhdGVkIHRocm91Z2ggdGhlIFVJLiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBpbnRlbnQgc3RhdHVzIGlzIGBmYWlsZWRgLiBOdWxsIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50IChpLmUuLCBhbiBBUEkgZXJyb3Igb3IgdGhlIGF1dGhvcml6YXRpb24gYmVpbmcgZGVjbGluZWQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50R2V0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBpbnRlbnQuICBgUEVORElOR2A6IFRoZSB0cmFuc2ZlciBpbnRlbnQgaXMgcGVuZGluZy4gYFNVQ0NFRURFRGA6IFRoZSB0cmFuc2ZlciBpbnRlbnQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBgRkFJTEVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgdW5hYmxlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBTdWNjZWVkZWQgPSAnU1VDQ0VFREVEJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgYXJlIGluIHByb2Nlc3NpbmcgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXlvdXQgb3IgY29sbGVjdCBmdW5kcy4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3XigJlyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBmdW5kaW5nIGFjY291bnQgbGlua2VkIHRvIHRoaXMgUGxhaWQgTGVkZ2VyIHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IsIGFuZCBpZiBgZnVuZGluZ19hY2NvdW50X2lkYCBpcyBsZWZ0IGJsYW5rLCB0aGUgb3JpZ2luYXRvclxcJ3MgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwb3NpdGl2ZSBhbW91bnQgb2YgaG93IG11Y2ggd2lsbCBiZSBkZXBvc2l0ZWQgaW50byBsZWRnZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGVwb3NpdC4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkZXBvc2l0IGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRlcG9zaXQgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQUNITmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyQUNITmV0d29yaztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgdG8gcHVsbCBtb25leSBmcm9tLiBNdXN0IGJlIHRoZSBwbGF0Zm9ybSBpdHNlbGYgb3IgaXRzIG9yaWdpbmF0b3IuIE9uZSBvZiBgZnJvbV9jbGllbnRfaWRgIGFuZCBgdG9fY2xpZW50X2lkYCBtdXN0IGJlIHRoZSBwbGF0Zm9ybVxcJ3MgYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCB0byBjcmVkaXQgbW9uZXkgdG8uIE11c3QgYmUgdGhlIHBsYXRmb3JtIGl0c2VsZiBvciBpdHMgb3JpZ2luYXRvci4gT25lIG9mIGBmcm9tX2NsaWVudF9pZGAgYW5kIGB0b19jbGllbnRfaWRgIG11c3QgYmUgdGhlIHBsYXRmb3JtXFwncyBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgdG9fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBtb3ZlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIEFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGlzdHJpYnV0ZS4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkaXN0cmlidXRlIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRpc3RyaWJ1dGUgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBsZWRnZXIgZGlzdHJpYnV0ZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJMZWRnZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYHNldHRsZWRgLCBgZmFpbGVkYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgbGVkZ2VyIHN3ZWVwIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLnBvc3RlZGAgIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLmZhaWxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAuc2V0dGxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAucmV0dXJuZWRgICBgc3dlZXAuc2V0dGxlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGUge1xuICAgIFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW914oCZcmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCBsaW5rZWQgdG8gdGhpcyBQbGFpZCBMZWRnZXIgdG8gdXNlLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciwgYW5kIGlmIGBmdW5kaW5nX2FjY291bnRfaWRgIGlzIGxlZnQgYmxhbmssIHRoZSBvcmlnaW5hdG9yXFwncyBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwb3NpdGl2ZSBhbW91bnQgb2YgaG93IG11Y2ggd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGUgbGVkZ2VyIGJhbGFuY2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciB3aXRoZHJhdy4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciB3aXRoZHJhdyBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3aXRoZHJhdyBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gVGhpcyBpcyB0aGUgQUJBIG51bWJlcjsgZm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgQUNIIG51bWJlciB1c2VkIGluIGByb3V0aW5nX251bWJlcmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA1OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgcnRwYCwgIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSByb3V0ZSBiZXR3ZWVuIFJlYWwgVGltZSBQYXltZW50IHJhaWwgYnkgVENIIG9yIEZlZE5vdyByYWlscyBhcyBuZWNlc3NhcnkuIElmIGEgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFzIGBydHBgIGFuZCB0aGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgbm90IGVsaWdpYmxlIGZvciBSVFAsIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCByZXF1ZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGBJTlZBTElEX0ZJRUxEYCBlcnJvciBjb2RlLiBUbyBwcmUtY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb3VudGVycGFydHkgYWNjb3VudCBjYW4gc3VwcG9ydCBSVFAsIGNhbGwgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBiZWZvcmUgY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnXG59XG5cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR3by1sZXR0ZXIgY29kZSBmb3IgdGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyIGJlaW5nIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcHVibGljLWZhY2luZyBzdXJmYWNlcywgZS5nLiBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvci4gVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyBhbmQgc2hvdWxkIGJlIHN0b3JlZCBhc3NvY2lhdGVkIHdpdGggZW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGJ1c2luZXNzIG5hbWUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGJhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCBJRCBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICB0YXhfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGNyZWRpdF91c2FnZV9jb25maWd1cmF0aW9uPzogVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBkZWJpdF91c2FnZV9jb25maWd1cmF0aW9uPzogVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBOQUlDUyBjb2RlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIG5haWNzX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGdW5kaW5nQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50OiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lciAoaS5lLiB0aGUgb3JpZ2luYXRvcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldGFpbGVkT3JpZ2luYXRvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yOiBEZXRhaWxlZE9yaWdpbmF0b3I7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvcmlnaW5hdG9ycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvcmlnaW5hdG9ycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE9yaWdpbmF0b3I+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yczogQXJyYXk8T3JpZ2luYXRvcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIGNvbXBsZXRpbmcgcXVlc3Rpb25zIGluIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVSTCB0aGF0IHlvdSB3aWxsIHJlZGlyZWN0IHRoZSBlbmQgY3VzdG9tZXIgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbmJvYXJkaW5nX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHJlY3VycmluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHJlY3VycmluZyBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgYHNhbmRib3hgIGVudmlyb25tZW50LiBJZiBwcm92aWRlZCwgdGhlIGNyZWF0ZWQgYHJlY3VycmluZ190cmFuc2ZlcmAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuIE5ldyBvcmlnaW5hdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgYHRlc3RfY2xvY2tgIGFkdmFuY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBUcmFuc2ZlckRldmljZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcj86IFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyOiBSZWN1cnJpbmdUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJzOiBBcnJheTxSZWN1cnJpbmdUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmUgZXhlY3V0ZWQgb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX3VuaXQ6IFRyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXQ7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgYGludGVydmFsX3VuaXRzYCBiZXR3ZWVuIG9yaWdpbmF0aW9ucy4gVGhlIHJlY3VycmluZyBpbnRlcnZhbCAoYmVmb3JlIGhvbGlkYXkgYWRqdXN0bWVudCkgaXMgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZyBgaW50ZXJ2YWxfdW5pdGAgYW5kIGBpbnRlcnZhbF9jb3VudGAuIEZvciBleGFtcGxlLCB0byBzY2hlZHVsZSBhIHJlY3VycmluZyB0cmFuc2ZlciB3aGljaCBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgdHdvIHdlZWtzLCBzZXQgYGludGVydmFsX3VuaXRgID0gYHdlZWtgIGFuZCBgaW50ZXJ2YWxfY291bnRgID0gMi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgdHJhbnNmZXIuICBJZiB0aGUgYGludGVydmFsX3VuaXRgIGlzIGB3ZWVrYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA1IChGcmlkYXkpLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgbW9udGhgLCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgdHJhbnNmZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLiAgVGhlIHRyYW5zZmVyIHdpbGwgYmUgb3JpZ2luYXRlZCBvbiB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaWYgdGhlIGRlc2lnbmF0ZWQgZGF5IGlzIGEgbm9uIGJhbmtpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuICBgYWN0aXZlYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYWN0aXZlLiBgY2FuY2VsbGVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQgb3IgUGxhaWQuIGBleHBpcmVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBoYXMgY29tcGxldGVkIGFsbCBvcmlnaW5hdGlvbnMgYWNjb3JkaW5nIHRvIGl0cyByZWN1cnJpbmcgc2NoZWR1bGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cyB7XG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZ1bmQgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHRvIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlZnVuZFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlclJlZnVuZEZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgcmVmdW5kIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEN1cnJlbnRseSwgdGhlIGZpZWxkIHdpbGwgcmVtYWluIG51bGwgZm9yIHRyYW5zZmVycyBvbiBvdGhlciByYWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgdG8gcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVmdW5kLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVmdW5kIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlZnVuZCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZDogVHJhbnNmZXJSZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSByZWZ1bmQgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWZ1bmQuICBgcGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGhhdmUgYmVlbiByZWZ1bmRlZCB0byB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gYGZhaWxlZGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZC4gYHJldHVybmVkYDogVGhlIHJlZnVuZCB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlZnVuZFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIEEgcmVwYXltZW50IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhZnRlciBvbmUgb3IgbW9yZSBndWFyYW50ZWVkIHRyYW5zYWN0aW9ucyByZWNlaXZlIGEgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxpZ2libGUgcmV0dXJucyBpbiBhIGRheSwgdGhleSBhcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHJlcGF5bWVudC4gIFJlcGF5bWVudHMgYXJlIHNlbnQgb3ZlciBBQ0gsIHdpdGggZnVuZHMgdHlwaWNhbGx5IGF2YWlsYWJsZSBvbiB0aGUgbmV4dCBiYW5raW5nIGRheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHJlcGF5bWVudCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlY2ltYWwgYW1vdW50IG9mIHRoZSByZXBheW1lbnQgYXMgaXQgYXBwZWFycyBvbiB5b3VyIGFjY291bnQgbGVkZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudCB0byBxdWVyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBzd2VlcCBvZiBmdW5kcyB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBBIHN3ZWVwIGlzIGFzc29jaWF0ZWQgd2l0aCBtYW55IHN3ZWVwIGV2ZW50cyAoZXZlbnRzIG9mIHR5cGUgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCkgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBzd2VlcF9pZGAuICBgc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIHRoZSB0cmFuc2ZlciBhbW91bnQgaXMgY3JlZGl0ZWQgb3IgZGViaXRlZCBmcm9tIHlvdXIgc3dlZXAgYWNjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgdHlwZWAgb2YgdGhlIHRyYW5zZmVyLiBgcmV0dXJuX3N3ZXB0YCBldmVudHMgb2NjdXIgd2hlbiBhIHRyYW5zZmVyIGlzIHJldHVybmVkIGFuZCBQbGFpZCB1bmRvZXMgdGhlIGNyZWRpdCBvciBkZWJpdC4gIFRoZSB0b3RhbCBzdW0gb2YgdGhlIGBzd2VwdGAgYW5kIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBpcyBlcXVhbCB0byB0aGUgYGFtb3VudGAgb2YgdGhlIHN3ZWVwIFBsYWlkIGNyZWF0ZXMgYW5kIG1hdGNoZXMgdGhlIGFtb3VudCBvZiB0aGUgZW50cnkgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXAge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gQ3VycmVudGx5LCB0aGUgZmllbGQgd2lsbCByZW1haW4gbnVsbCBmb3IgdHJhbnNmZXJzIG9uIG90aGVyIHJhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzd2VlcCAoVVVJRCkgb3IgYSBzaG9ydGVuZWQgZm9ybSBjb25zaXN0aW5nIG9mIHRoZSBmaXJzdCA4IGNoYXJhY3RlcnMgb2YgdGhlIGlkZW50aWZpZXIgKDgtZGlnaXQgaGV4YWRlY2ltYWwgc3RyaW5nKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2VlcHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHN3ZWVwcyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIGluY2x1ZGVkIGB0cmFuc2Zlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8VHJhbnNmZXJTd2VlcD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHN3ZWVwIGZvciB0aGUgdHJhbnNmZXIuICBgdW5zd2VwdGA6IFRoZSB0cmFuc2ZlciBoYXNuXFwndCBiZWVuIHN3ZXB0IHlldC4gYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byB0aGUgc3dlZXAgYWNjb3VudC4gYHN3ZXB0X3NldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgY3VzdG9tZXLigJlzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQuIGByZXR1cm5fc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBiYWNrIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiBgbnVsbGA6IFRoZSB0cmFuc2ZlciB3aWxsIG5ldmVyIGJlIHN3ZXB0IChlLmcuIGlmIHRoZSB0cmFuc2ZlciBpcyBjYW5jZWxsZWQgb3IgcmV0dXJuZWQgYmVmb3JlIGJlaW5nIHN3ZXB0KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTd2VlcFN0YXR1cyB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBVbnN3ZXB0ID0gJ3Vuc3dlcHQnLFxuICAgIFN3ZXB0ID0gJ3N3ZXB0JyxcbiAgICBTd2VwdFNldHRsZWQgPSAnc3dlcHRfc2V0dGxlZCcsXG4gICAgUmV0dXJuU3dlcHQgPSAncmV0dXJuX3N3ZXB0J1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJUZXN0Q2xvY2sge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeC4gXFxcIlNhbiBGcmFuY2lzY29cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhlIHVzZXIgY2FuIHJlc3RvcmUgYWNjZXNzIHRvIHRoZSByZXZva2VkIGFjY291bnQgYnkgcmVncmFudGluZyBwZXJtaXNzaW9ucyBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IGluIGJldGEuIEl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIEdBIGluIEphbiAyMDI0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgb2YgdGhlIGFmZmVjdGVkIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgdXNlci4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6IG5vdCBwcm92aWRlZCwgYWRkcmVzcyB3aXRoIG9ubHkgY291bnRyeSBjb2RlIG9yIGZ1bGwgYWRkcmVzcy4gIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYCB3ZWJob29rIG1heSBiZSBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyB1c2VkIGVpdGhlciB0aGUgW215LnBsYWlkLmNvbSBwb3J0YWxdKGh0dHBzOi8vbXkucGxhaWQuY29tKSBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9u4oCZcyBPQXV0aCBjb25zZW50IHBvcnRhbCB0byByZXZva2UgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gVGhpcyB3ZWJob29rIGlzIG5vdCBndWFyYW50ZWVkIHRvIGFsd2F5cyBiZSBmaXJlZCB1cG9uIGNvbnNlbnQgcmV2b2NhdGlvbiwgc2luY2Ugc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gT25jZSBhY2Nlc3MgdG8gYW4gSXRlbSBoYXMgYmVlbiByZXZva2VkLCBpdCBjYW5ub3QgYmUgcmVzdG9yZWQuIElmIHRoZSB1c2VyIHN1YnNlcXVlbnRseSByZXR1cm5zIHRvIHlvdXIgYXBwbGljYXRpb24sIGEgbmV3IEl0ZW0gbXVzdCBiZSBjcmVhdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5IHtcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IGZyZXF1ZW5jeSBvZiBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IHR5cGUgLSBgR1JPU1NgLCBgTkVUYCwgb3IgYFVOS05PV05gIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBHcm9zcyA9ICdHUk9TUycsXG4gICAgTmV0ID0gJ05FVCdcbn1cblxuLyoqXG4gKiBVc2VyVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBXMiBzdGF0ZSBhbmQgbG9jYWwgd2FnZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlcyB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBlbXBsb3llcl9zdGF0ZV9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbF93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbGl0eV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgZS13YWxsZXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0XG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0XG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IGJhbGFuY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudCBhZnRlciBzdWJ0cmFjdGluZyBwZW5kaW5nIGRlYml0IHRyYW5zYWN0aW9uIGFtb3VudHNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0SVNPQ3VycmVuY3lDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLCB1c2VkIHdpdGggZS13YWxsZXRzIGFuZCB0cmFuc2FjdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRJU09DdXJyZW5jeUNvZGUge1xuICAgIEdicCA9ICdHQlAnLFxuICAgIEV1ciA9ICdFVVInXG59XG5cbi8qKlxuICogV2FsbGV0TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgZS13YWxsZXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGF0IGUtd2FsbGV0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGUtd2FsbGV0cyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlLXdhbGxldHMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBXYWxsZXRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGUtd2FsbGV0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRzOiBBcnJheTxXYWxsZXQ+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBlLXdhbGxldHMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCBlLXdhbGxldCBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxJQkFOfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IHNjaGVtZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQQVlPVVRgIGFuZCBgUkVGVU5EYC4gIGBGQVNURVJfUEFZTUVOVFNgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCBzY2hlbWUgd2l0aGluIHRoZSBVSy4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0UGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBGYXN0ZXJQYXltZW50cyA9ICdGQVNURVJfUEFZTUVOVFMnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHdhbGxldC4gIGBVTktOT1dOYDogVGhlIHdhbGxldCBzdGF0dXMgaXMgdW5rbm93bi4gIGBBQ1RJVkVgOiBUaGUgd2FsbGV0IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gc2VuZCBtb25leSB0byBhbmQgcmVjZWl2ZSBtb25leSBmcm9tLiAgYENMT1NFRGA6IFRoZSB3YWxsZXQgaXMgY2xvc2VkLiBBbnkgdHJhbnNhY3Rpb25zIG1hZGUgdG8gb3IgZnJvbSB0aGlzIHdhbGxldCB3aWxsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0U3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIENsb3NlZCA9ICdDTE9TRUQnXG59XG5cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9uIGRldGFpbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgZm9yIGEgV2FsbGV0IFRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsIHwgbnVsbDtcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuIEVuc3VyZSB0aGF0IHRoZSBgcmVmZXJlbmNlYCBmaWVsZCBpcyB1bmlxdWUgZm9yIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlcnJvciBjb2RlIG9mIGEgZmFpbGVkIHRyYW5zYWN0aW9uLiBFcnJvciBjb2RlcyBpbmNsdWRlOiBgRVhURVJOQUxfU1lTVEVNYDogVGhlIHRyYW5zYWN0aW9uIHdhcyBkZWNsaW5lZCBieSBhbiBleHRlcm5hbCBzeXN0ZW0uIGBFWFBJUkVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuIGBDQU5DRUxMRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCB3YXMgcmVzY2luZGVkLiBgSU5WQUxJRGA6IFRoZSB0cmFuc2FjdGlvbiBkaWQgbm90IG1lZXQgY2VydGFpbiBjcml0ZXJpYSwgc3VjaCBhcyBhbiBpbmFjdGl2ZSBhY2NvdW50IG9yIG5vIHZhbGlkIGNvdW50ZXJwYXJ0eSwgZXRjLiBgVU5LTk9XTmA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgdW5zdWNjZXNzZnVsLCBidXQgdGhlIGV4YWN0IGNhdXNlIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24ge1xuICAgIEV4dGVybmFsU3lzdGVtID0gJ0VYVEVSTkFMX1NZU1RFTScsXG4gICAgRXhwaXJlZCA9ICdFWFBJUkVEJyxcbiAgICBDYW5jZWxsZWQgPSAnQ0FOQ0VMTEVEJyxcbiAgICBJbnZhbGlkID0gJ0lOVkFMSUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGlkIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQSVNfUEFZX0lOYCBhbmQgYFJFRlVORGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVR5cGVFbnVtIHtcbiAgICBCYW5rVHJhbnNmZXIgPSAnQkFOS19UUkFOU0ZFUicsXG4gICAgUGF5b3V0ID0gJ1BBWU9VVCcsXG4gICAgUGlzUGF5SW4gPSAnUElTX1BBWV9JTicsXG4gICAgUmVmdW5kID0gJ1JFRlVORCcsXG4gICAgRnVuZHNTd2VlcCA9ICdGVU5EU19TV0VFUCcsXG4gICAgUmV0dXJuID0gJ1JFVFVSTidcbn1cblxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGF0IHRyYW5zYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCB3YWxsZXQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGF0IHRyYW5zYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEFzc2V0IFJlcG9ydCB0byBiZSByZXR1cm5lZCB3aXRoIG1pc3NpbmcgYWNjb3VudCBvd25lciBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQVNTRVRfUkVQT1JUX1dBUk5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLmBJTlZFU1RNRU5UU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgSW52ZXN0bWVudHMgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgdHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IFdhcm5pbmdXYXJuaW5nQ29kZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhcm5pbmdXYXJuaW5nQ29kZUVudW0ge1xuICAgIE93bmVyc1VuYXZhaWxhYmxlID0gJ09XTkVSU19VTkFWQUlMQUJMRScsXG4gICAgSW52ZXN0bWVudHNVbmF2YWlsYWJsZSA9ICdJTlZFU1RNRU5UU19VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGNoYW5nZSBtYWRlIHRvIHRoZSBwYXJlbnQgb2JqZWN0IHNwZWNpZnlpbmcgd2hhdCBjYXVzZWQgdGhlIGNoYW5nZSBhcyB3ZWxsIGFzIHdoZW4gaXQgb2NjdXJyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gICAgICovXG4gICAgc291cmNlOiBTb3VyY2U7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2ZmaWNpYWwgZG9jdW1lbnQsIHVzdWFsbHkgaXNzdWVkIGJ5IGEgZ292ZXJuaW5nIGJvZHkgb3IgaW5zdGl0dXRpb24sIHdpdGggYW4gYXNzb2NpYXRlZCBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFxuICAgICAqL1xuICAgIHR5cGU6IFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaXJ0aF9jZXJ0aWZpY2F0ZWAgLSBBIGNlcnRpZmljYXRlIG9mIGJpcnRoICBgZHJpdmVyc19saWNlbnNlYCAtIEEgbGljZW5zZSB0byBvcGVyYXRlIGEgbW90b3IgdmVoaWNsZSAgYGltbWlncmF0aW9uX251bWJlcmAgLSBJbW1pZ3JhdGlvbiBvciByZXNpZGVuY2UgZG9jdW1lbnRzICBgbWlsaXRhcnlfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGEgbWlsaXRhcnkgZ3JvdXAgIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHBhc3Nwb3J0YCAtIEFuIG9mZmljaWFsIHBhc3Nwb3J0IGlzc3VlIGJ5IGEgZ292ZXJubWVudCAgYHBlcnNvbmFsX2lkZW50aWZpY2F0aW9uYCAtIEFueSBnZW5lcmljIHBlcnNvbmFsIGlkZW50aWZpY2F0aW9uIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHJhdGlvbl9jYXJkYCAtIElkZW50aWZpY2F0aW9uIHRoYXQgZW50aXRsZXMgdGhlIGhvbGRlciB0byByYXRpb25zICBgc3NuYCAtIFVuaXRlZCBTdGF0ZXMgU29jaWFsIFNlY3VyaXR5IE51bWJlciAgYHN0dWRlbnRfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGFuIGVkdWNhdGlvbmFsIGluc3RpdHV0aW9uICBgdGF4X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29sbGVjdGluZyB0YXhlcyAgYHRyYXZlbF9kb2N1bWVudGAgLSBWaXNhcywgZW50cnkgcGVybWl0cywgcmVmdWdlZSBkb2N1bWVudHMsIGV0Yy4gIGB2b3Rlcl9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHZvdGluZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlIHtcbiAgICBCaXJ0aENlcnRpZmljYXRlID0gJ2JpcnRoX2NlcnRpZmljYXRlJyxcbiAgICBEcml2ZXJzTGljZW5zZSA9ICdkcml2ZXJzX2xpY2Vuc2UnLFxuICAgIEltbWlncmF0aW9uTnVtYmVyID0gJ2ltbWlncmF0aW9uX251bWJlcicsXG4gICAgTWlsaXRhcnlJZCA9ICdtaWxpdGFyeV9pZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBQZXJzb25hbElkZW50aWZpY2F0aW9uID0gJ3BlcnNvbmFsX2lkZW50aWZpY2F0aW9uJyxcbiAgICBSYXRpb25DYXJkID0gJ3JhdGlvbl9jYXJkJyxcbiAgICBTc24gPSAnc3NuJyxcbiAgICBTdHVkZW50SWQgPSAnc3R1ZGVudF9pZCcsXG4gICAgVGF4SWQgPSAndGF4X2lkJyxcbiAgICBUcmF2ZWxEb2N1bWVudCA9ICd0cmF2ZWxfZG9jdW1lbnQnLFxuICAgIFZvdGVySWQgPSAndm90ZXJfaWQnXG59XG5cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYW4gZW50aXR5IHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBoaXRzIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2hpdHM6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSByZXZpZXcgZm9yIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdG8gcmVzZXQgYmFjayB0byBudWxsXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVzZXRfZmllbGRzPzogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZD4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZpZWxkIHRoYXQgY2FuIGJlIHJlc2V0IGJhY2sgdG8gbnVsbFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3Qgb3IgUEVQIGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZyBoaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICByZXZpZXdfc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGZpcnN0X2FjdGl2ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpbmFjdGl2ZV9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogSW5kaXZpZHVhbFdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IFNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIExvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBsb2NhdGlvbiBzdHJpbmcsIHBvdGVudGlhbGx5IGluY2x1ZGluZyBlbGVtZW50cyBsaWtlIHN0cmVldCwgY2l0eSwgcG9zdGFsIGNvZGVzIGFuZCBjb3VudHJ5IGNvZGVzLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBjb21wbGV0ZSBvciB3ZWxsLWZvcm1hdHRlZCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgcmV2aWV3LiBBbGwgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzIGJlZ2luIGluIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0ZSBidXQgY2FuIGJlIGNoYW5nZWQgYnkgY3JlYXRpbmcgYSByZXZpZXcuIFdoZW4gYSBoaXQgaXMgaW4gdGhlIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUsIGl0IHdpbGwgYWx3YXlzIHNob3cgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB3YXRjaGxpc3QgZGF0YSBQbGFpZCBoYXMgYXZhaWxhYmxlIGFuZCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBsYXRlc3QgY3VzdG9tZXIgaW5mb3JtYXRpb24gc2F2ZWQgaW4gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcuIE9uY2UgYSBoaXQgaGFzIGJlZW4gbWFya2VkIGFzIGBjb25maXJtZWRgIG9yIGBkaXNtaXNzZWRgIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGUgc3RhdGUgaXMgYXMgaXQgd2FzIHdoZW4gdGhlIHJldmlldyB3YXMgZmlyc3QgY29uZHVjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzIHtcbiAgICBDb25maXJtZWQgPSAnY29uZmlybWVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBEaXNtaXNzZWQgPSAnZGlzbWlzc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgaGl0cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtcyBmb3IgaW5kaXZpZHVhbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21tZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyByZXZpZXdzIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZWRpdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHNlYXJjaCB0ZXJtcy4gU3RhcnRzIGF0IGAxYCBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggZWRpdCB0byBgc2VhcmNoX3Rlcm1zYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogQSBzdGF0dXMgZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBzY3JlZW5pbmcgaXMgc3RpbGwgcGVuZGluZyByZXZpZXcsIGhhcyBiZWVuIHJlamVjdGVkLCBvciBoYXMgYmVlbiBjbGVhcmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIE5hbWVzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkIGFzIGxvdyBxdWFsaXR5IGVpdGhlciBieSB0aGVpciBgc291cmNlYCBsaXN0LCBvciBieSBgcGxhaWRgIGJ5IGEgc2VyaWVzIG9mIGFkZGl0aW9uYWwgY2hlY2tzIGRvbmUgYnkgUGxhaWQuIFBsYWlkIGRvZXMgbm90IGV2ZXIgc3VyZmFjZSBhIGhpdCBhcyBhIHJlc3VsdCBvZiBhIHdlYWsgbmFtZSBhbG9uZS4gSWYgYSBuYW1lIGhhcyBubyBxdWFsaXR5IGlzc3VlcywgdGhpcyB2YWx1ZSB3aWxsIGJlIGBub25lYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYWtBbGlhc0RldGVybWluYXRpb24ge1xuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgU291cmNlID0gJ3NvdXJjZScsXG4gICAgUGxhaWQgPSAncGxhaWQnXG59XG5cbi8qKlxuICogVGhlIFBsYWlkIGVudmlyb25tZW50IHRoZSB3ZWJob29rIHdhcyBzZW50IGZyb21cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcyB7XG4gICAgRGV2ZWxvcG1lbnQgPSAnZGV2ZWxvcG1lbnQnLFxuICAgIFNhbmRib3ggPSAnc2FuZGJveCcsXG4gICAgUHJvZHVjdGlvbiA9ICdwcm9kdWN0aW9uJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIHR5cGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYmhvb2tUeXBlIHtcbiAgICBBdXRoID0gJ0FVVEgnLFxuICAgIEhvbGRpbmdzID0gJ0hPTERJTkdTJyxcbiAgICBJbnZlc3RtZW50c1RyYW5zYWN0aW9ucyA9ICdJTlZFU1RNRU5UU19UUkFOU0FDVElPTlMnLFxuICAgIEl0ZW0gPSAnSVRFTScsXG4gICAgTGlhYmlsaXRpZXMgPSAnTElBQklMSVRJRVMnLFxuICAgIFRyYW5zYWN0aW9ucyA9ICdUUkFOU0FDVElPTlMnLFxuICAgIEFzc2V0cyA9ICdBU1NFVFMnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB3ZWJob29rIGlzIHVwZGF0ZWQuIFRoaXMgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IElEICggYGtpZGAgKSBmcm9tIHRoZSBKV1QgaGVhZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAga2V5X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SldLUHVibGljS2V5fVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBrZXk6IEpXS1B1YmxpY0tleTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgcHJlLXRheCBlYXJuaW5ncywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cblxuLyoqXG4gKiBQbGFpZEFwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0OiBhc3luYyAoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0JhbGFuY2VHZXQnLCAnYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCcsIGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyDigJQgdGhhdCBpcywgYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiBGb3IgaXRlbXMgdGhhdCB3ZW50IHRocm91Z2ggdGhlIHVwZGF0ZWQgYWNjb3VudCBzZWxlY3Rpb24gcGFuZSwgdGhpcyBlbmRwb2ludCBvbmx5IHJldHVybnMgYWNjb3VudHMgdGhhdCB3ZXJlIHBlcm1pc3Npb25lZCBieSB0aGUgdXNlciB3aGVuIHRoZXkgaW5pdGlhbGx5IGNyZWF0ZWQgdGhlIEl0ZW0uIElmIGEgdXNlciBjcmVhdGVzIGEgbmV3IGFjY291bnQgYWZ0ZXIgdGhlIGluaXRpYWwgbGluaywgeW91IGNhbiBjYXB0dXJlIHRoaXMgZXZlbnQgdGhyb3VnaCB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGU6IGFzeW5jIChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0Q3JlYXRlJywgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXI6IGFzeW5jIChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0RmlsdGVyJywgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcsIGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEdldCcsICdhc3NldFJlcG9ydEdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQ6IGFzeW5jIChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UGRmR2V0JywgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2g6IGFzeW5jIChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVmcmVzaCcsICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoR2V0OiBhc3luYyAoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoR2V0JywgJ2F1dGhHZXRSZXF1ZXN0JywgYXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGF1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXQnLCAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsOiBhc3luYyAoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDYW5jZWwnLCAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ3JlYXRlJywgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdCcsICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50U3luYycsICdiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJHZXQnLCAnYmFua1RyYW5zZmVyR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2Zlckxpc3QnLCAnYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudDogYXN5bmMgKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQnLCAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJTd2VlcEdldCcsICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJTd2VlcExpc3QnLCAnYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBjdXN0b21lciB0byByZXRyaWV2ZSBhIEJhc2UgUmVwb3J0LiBDdXN0b21lcnMgc2hvdWxkIHBhc3MgaW4gdGhlIGB1c2VyX3Rva2VuYCBjcmVhdGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmFzZVJlcG9ydEdldFJlcXVlc3R9IGJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFzZVJlcG9ydEdldDogYXN5bmMgKGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYXNlUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFzZVJlcG9ydEdldCcsICdiYXNlUmVwb3J0R2V0UmVxdWVzdCcsIGJhc2VSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvYmFzZV9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdH0gYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkR1cGxpY2F0ZUdldDogYXN5bmMgKGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uRHVwbGljYXRlR2V0JywgJ2JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QnLCBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vZHVwbGljYXRlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIGZyYXVkIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci4gIE5vdGU6IElmIHlvdSBhcmUgY3JlYXRpbmcgdXNlcnMgd2l0aCB0aGUgZXhwcmVzcyBwdXJwb3NlIG9mIHByb3ZpZGluZyBoaXN0b3JpY2FsIGZyYXVkIGRhdGEsIHlvdSBzaG91bGQgdXNlIHRoZSBgL2JlYWNvbi91c2VyL2NyZWF0ZWAgZW5kcG9pbnQgaW5zdGVhZCBhbmQgZW1iZWQgdGhlIGZyYXVkIHJlcG9ydCBpbiB0aGUgcmVxdWVzdC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBCZWFjb24gVXNlciB5b3UgY3JlYXRlIHdpbGwgbm90IGJlIHN1YmplY3QgdG8gYW55IGJpbGxpbmcgY29zdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0Q3JlYXRlOiBhc3luYyAoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRDcmVhdGUnLCAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRHZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydEdldCcsICdiZWFjb25SZXBvcnRHZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0TGlzdCcsICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcsIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3Q6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlOiBhc3luYyAoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyQ3JlYXRlJywgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JywgYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldDogYXN5bmMgKGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckdldCcsICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3OiBhc3luYyAoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyUmV2aWV3JywgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JywgYmVhY29uVXNlclJldmlld1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3Jldmlld2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbS4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGU6IGFzeW5jIChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJVcGRhdGUnLCAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldDogYXN5bmMgKGJvZHk6IG9iamVjdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdib2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXRlZ29yaWVzR2V0JywgJ2JvZHknLCBib2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXRlZ29yaWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChib2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lR2V0OiBhc3luYyAoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFCYW5rSW5jb21lR2V0JywgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JywgY3JhQmFua0luY29tZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYW5rX2luY29tZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlUGF5bWVudFRva2VuOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVhdGVQYXltZW50VG9rZW4nLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQ6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldCcsICdyZXF1ZXN0Qm9keScsIHJlcXVlc3RCb2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChyZXF1ZXN0Qm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUnLCAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JywgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUnLCAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JywgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rRW1wbG95bWVudEdldCcsICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnLCBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVBkZkdldDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVBkZkdldCcsICdjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZScsICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0JywgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0OiBhc3luYyAoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldCcsICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnLCBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGU6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2s6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjaycsICdjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgZnJhdWRfcmlza2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBmcmF1ZCBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBtYW51YWxseSB1cGxvYWRlZCBkb2N1bWVudChzKS5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0OiBhc3luYyAoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlDcmVhdGU6IGFzeW5jIChjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5Q3JlYXRlJywgJ2NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCcsIGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0OiBhc3luYyAoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUdldCcsICdjcmVkaXRSZWxheUdldFJlcXVlc3QnLCBjcmVkaXRSZWxheUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldDogYXN5bmMgKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlQZGZHZXQnLCAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JywgY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlZnJlc2g6IGFzeW5jIChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5UmVmcmVzaCcsICdjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmU6IGFzeW5jIChjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5UmVtb3ZlJywgJ2NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCcsIGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0JywgY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFNlc3Npb25zR2V0OiBhc3luYyAoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRTZXNzaW9uc0dldCcsICdjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QnLCBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZGFzaGJvYXJkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0OiBhc3luYyAoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyR2V0JywgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJMaXN0OiBhc3luYyAoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyTGlzdCcsICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaENyZWF0ZScsICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQ6IGFzeW5jIChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hHZXQnLCAnZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZScsICdkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3llcnNTZWFyY2g6IGFzeW5jIChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2VtcGxveWVyc1NlYXJjaCcsICdlbXBsb3llcnNTZWFyY2hSZXF1ZXN0JywgZW1wbG95ZXJzU2VhcmNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZW1wbG95ZXJzL3NlYXJjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQ6IGFzeW5jIChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2VtcGxveW1lbnRWZXJpZmljYXRpb25HZXQnLCAnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QnLCBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Tm90aWZpY2F0aW9uczogYXN5bmMgKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ZEWE5vdGlmaWNhdGlvbicgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZmR4Tm90aWZpY2F0aW9ucycsICdmRFhOb3RpZmljYXRpb24nLCBmRFhOb3RpZmljYXRpb24pXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ZkeC9ub3RpZmljYXRpb25zYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGZEWE5vdGlmaWNhdGlvbiwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5R2V0OiBhc3luYyAoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eUdldCcsICdpZGVudGl0eUdldFJlcXVlc3QnLCBpZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2g6IGFzeW5jIChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5TWF0Y2gnLCAnaWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBpZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvbWF0Y2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlNYXRjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlSZWZyZXNoOiBhc3luYyAoaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVJlZnJlc2gnLCAnaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCcsIGlkZW50aXR5UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9mIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGU6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2F1dG9maWxsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQ6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0JywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0JywgJ2lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnk6IGFzeW5jIChpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnknLCAnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL3JldHJ5YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZTogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlJywgJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkJywgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjazogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2snLCAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldDogYXN5bmMgKGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zR2V0JywgJ2luc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXRCeUlkOiBhc3luYyAoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXRCeUlkJywgJ2luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0JywgaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2g6IGFzeW5jIChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc1NlYXJjaCcsICdpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0JywgaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL3NlYXJjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNBdXRoR2V0OiBhc3luYyAoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c0F1dGhHZXQnLCAnaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCcsIGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0hvbGRpbmdzR2V0OiBhc3luYyAoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c0hvbGRpbmdzR2V0JywgJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudHMsIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBcXFwiTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1JlZnJlc2g6IGFzeW5jIChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzUmVmcmVzaCcsICdpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0JywgaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldDogYXN5bmMgKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQnLCAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGU6IGFzeW5jIChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUnLCAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnLCBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY3Rpdml0eUxpc3Q6IGFzeW5jIChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdDogSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BY3Rpdml0eUxpc3QnLCAnaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QnLCBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hY3Rpdml0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdDogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uTGlzdCcsICdpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGU6IGFzeW5jIChpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZScsICdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblVubGluazogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uVW5saW5rJywgJ2l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbjogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUNyZWF0ZVB1YmxpY1Rva2VuJywgJ2l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQ6IGFzeW5jIChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1HZXQnLCAnaXRlbUdldFJlcXVlc3QnLCBpdGVtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQ6IGFzeW5jIChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUltcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1JbXBvcnQnLCAnaXRlbUltcG9ydFJlcXVlc3QnLCBpdGVtSW1wb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9pbXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUltcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2U6IGFzeW5jIChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlJywgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlOiBhc3luYyAoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUmVtb3ZlJywgJ2l0ZW1SZW1vdmVSZXF1ZXN0JywgaXRlbVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZTogYXN5bmMgKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVdlYmhvb2tVcGRhdGUnLCAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JywgaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0OiBhc3luYyAobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaWFiaWxpdGllc0dldCcsICdsaWFiaWxpdGllc0dldFJlcXVlc3QnLCBsaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaWFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGU6IGFzeW5jIChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUNyZWF0ZScsICdsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0OiBhc3luYyAobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rRGVsaXZlcnlHZXQnLCAnbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCcsIGxpbmtEZWxpdmVyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmtfZGVsaXZlcnkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZTogYXN5bmMgKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlJywgJ2xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QnLCBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSB1cGRhdGUgbW9kZSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZTogYXN5bmMgKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuQ3JlYXRlJywgJ2xpbmtUb2tlbkNyZWF0ZVJlcXVlc3QnLCBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuR2V0OiBhc3luYyAobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5HZXQnLCAnbGlua1Rva2VuR2V0UmVxdWVzdCcsIGxpbmtUb2tlbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckNyZWF0ZScsICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyRW5hYmxlOiBhc3luYyAocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJFbmFibGUnLCAncGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJHZXQ6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckdldCcsICdwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQnLCAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lclJlbW92ZScsICdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiBGb3IgZGV0YWlscyBvbiBhbnkgcGF5bWVudCBsaW1pdHMgaW4gUHJvZHVjdGlvbiwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUNyZWF0ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVDcmVhdGUnLCAncGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVHZXQ6IGFzeW5jIChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlR2V0JywgJ3BheW1lbnRQcm9maWxlR2V0UmVxdWVzdCcsIHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlUmVtb3ZlOiBhc3luYyAocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZVJlbW92ZScsICdwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QnLCBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBY2NvdW50R2V0OiBhc3luYyAocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBY2NvdW50R2V0JywgJ3Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQ6IGFzeW5jIChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckF1dGhHZXQnLCAncHJvY2Vzc29yQXV0aEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQ6IGFzeW5jIChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckJhbGFuY2VHZXQnLCAncHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QnLCBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZScsICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlHZXQ6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5R2V0JywgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcsIHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIElkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eU1hdGNoOiBhc3luYyAocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJZGVudGl0eU1hdGNoJywgJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0JywgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldDogYXN5bmMgKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQnLCAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JywgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlOiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZScsICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFByZXBhcmU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbFByZXBhcmUnLCAncHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0JywgJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBJZiB0aGUgYWNjb3VudCBtdXN0IGJlIGxpbmtlZCB0byBhIG5ldyBvciBkaWZmZXJlbnQgcGFydG5lciByZXNvdXJjZSwgY3JlYXRlIGEgbmV3IEl0ZW0gYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggdGhlIExpbmsgZmxvdyBhZ2FpbjsgYSBuZXcgcHJvY2Vzc29yIHRva2VuIGNhbiB0aGVuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiBQcm9jZXNzb3IgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0JywgJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUnLCAncHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCcsIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0JywgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVwbGFjZXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGl0cyBhc3NvY2lhdGVkIHdlYmhvb2tzIGZvciBtb3N0IGNvbW1vbiB1c2UtY2FzZXMuICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9jZXNzb3IgdG9rZW4gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgcHJvY2Vzc29yIHRva2VuLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUsIHdoaWNoIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBmb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzb3IgdG9rZW5zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZScsICdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFRyYW5zYWN0aW9ucyB1cGRhdGUgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQWNjb3VudCBTZWxlY3QgdjIuICBgQVVUSF9EQVRBX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBdXRoIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luOiBhc3luYyAoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVJlc2V0TG9naW4nLCAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1czogYXN5bmMgKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMnLCAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0Jywgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHM6IGFzeW5jIChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzJywgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcsIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luJywgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHVibGljVG9rZW5DcmVhdGU6IGFzeW5jIChzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZScsICdzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0Jywgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2snLCAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZScsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZScsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0OiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0OiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0JywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRGVjaXNpb25SZXBvcnQnLCAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0Jywgc2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxQcmVwYXJlOiBhc3luYyAoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbFByZXBhcmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxQcmVwYXJlJywgJ3NpZ25hbFByZXBhcmVSZXF1ZXN0Jywgc2lnbmFsUHJlcGFyZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9wcmVwYXJlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQ6IGFzeW5jIChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFJldHVyblJlcG9ydCcsICdzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZDogYXN5bmMgKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0Rvd25sb2FkJywgJ3N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QnLCBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNMaXN0OiBhc3luYyAoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzTGlzdCcsICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnLCBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNSZWZyZXNoOiBhc3luYyAoc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzUmVmcmVzaCcsICdzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QnLCBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZTogYXN5bmMgKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zRW5oYW5jZScsICd0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoOiBhc3luYyAodHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbnJpY2gnLCAndHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zR2V0JywgJ3RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gRm9yIG9wdGltYWwgcmVzdWx0cywgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIGN1c3RvbWVycyB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBpdGVtcyB3aXRoIFRyYW5zYWN0aW9ucyAodXNpbmcgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBvcHRpb24pLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0JywgJ3RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jICh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1JlZnJlc2gnLCAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlOiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZScsICd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3Q6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdCcsICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlOiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZScsICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jOiBhc3luYyAodHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNTeW5jJywgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JywgdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCcsICd0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUnLCAndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckJhbGFuY2VHZXQnLCAndHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhbmNlbCcsICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXIuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhcGFiaWxpdGllc0dldDogYXN5bmMgKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQnLCAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JywgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldDogYXN5bmMgKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0JywgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnLCB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDcmVhdGU6IGFzeW5jICh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ3JlYXRlJywgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCcsICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcsIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQnLCAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50TGlzdCcsICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudFN5bmMnLCAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyR2V0OiBhc3luYyAodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckdldCcsICd0cmFuc2ZlckdldFJlcXVlc3QnLCB0cmFuc2ZlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZTogYXN5bmMgKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJJbnRlbnRDcmVhdGUnLCAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0OiBhc3luYyAocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlcXVlc3RCb2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudEdldCcsICdyZXF1ZXN0Qm9keScsIHJlcXVlc3RCb2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9pbnRlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRlcG9zaXQnLCAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZTogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlJywgJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckdldCcsICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdzogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJXaXRoZHJhdycsICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0OiBhc3luYyAodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlckxpc3QnLCAndHJhbnNmZXJMaXN0UmVxdWVzdCcsIHRyYW5zZmVyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0OiBhc3luYyAodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1ldHJpY3NHZXQnLCAndHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCcsIHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNaWdyYXRlQWNjb3VudDogYXN5bmMgKHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcsIHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlJywgJ3RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZTogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JywgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JHZXQ6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckdldCcsICd0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0JywgdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0OiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JMaXN0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0JywgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUnLCAndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIFNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCcsICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUnLCAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdHZXQnLCAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdMaXN0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0xpc3QnLCAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWZ1bmRDYW5jZWwnLCAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFByb2Nlc3Npbmcgb2YgdGhlIHJlZnVuZCB3aWxsIG5vdCBvY2N1ciB1bnRpbCBhdCBsZWFzdCA0IGJ1c2luZXNzIGRheXMgZm9sbG93aW5nIHRoZSB0cmFuc2ZlclxcJ3Mgc2V0dGxlbWVudCBkYXRlLCBwbHVzIGFueSBob2xkL3NldHRsZW1lbnQgZGVsYXlzLiBUaGlzIDMtZGF5IHdpbmRvdyBoZWxwcyBiZXR0ZXIgcHJvdGVjdCB5b3VyIGJ1c2luZXNzIGZyb20gcmVndWxhciBBQ0ggcmV0dXJucy4gQ29uc3VtZXIgaW5pdGlhdGVkIHJldHVybnMgKHVuYXV0aG9yaXplZCByZXR1cm5zKSBjb3VsZCBzdGlsbCBoYXBwZW4gZm9yIGFib3V0IDYwIGRheXMgZnJvbSB0aGUgc2V0dGxlbWVudCBkYXRlLiBJZiB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgaXMgY2FuY2VsZWQsIHJldHVybmVkIG9yIGZhaWxlZCwgYWxsIHBlbmRpbmcgcmVmdW5kcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2FuY2VsZWQuIFByb2Nlc3NlZCByZWZ1bmRzIGNhbm5vdCBiZSByZXZva2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENyZWF0ZScsICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0OiBhc3luYyAodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZEdldCcsICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3Q6IGFzeW5jICh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVwYXltZW50TGlzdCcsICd0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcEdldCcsICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdDogYXN5bmMgKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcExpc3QnLCAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBpbmNvbWUgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBpbmNvbWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGU6IGFzeW5jICh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJDcmVhdGUnLCAndXNlckNyZWF0ZVJlcXVlc3QnLCB1c2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIFRoZSBgdXNlcl90b2tlbmAgc2hvdWxkIGJlIGluIHRoZSByZXNwb25zZSBvZiBgL3VzZXIvY3JlYXRlYCBjYWxsICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgd2l0aCBhIG5vbi1leGlzdCBgdXNlcl90b2tlbmAsIHRoZSBjYWxsIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIHRva2VuIGlzIG5vdCBmb3VuZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlOiBhc3luYyAodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVXBkYXRlJywgJ3VzZXJVcGRhdGVSZXF1ZXN0JywgdXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZTogYXN5bmMgKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0Q3JlYXRlJywgJ3dhbGxldENyZWF0ZVJlcXVlc3QnLCB3YWxsZXRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQ6IGFzeW5jICh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldEdldCcsICd3YWxsZXRHZXRSZXF1ZXN0Jywgd2FsbGV0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdDogYXN5bmMgKHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0TGlzdCcsICd3YWxsZXRMaXN0UmVxdWVzdCcsIHdhbGxldExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlOiBhc3luYyAod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUnLCAnd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQ6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uR2V0JywgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Q6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uTGlzdCcsICd3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGl0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcHJvZ3JhbS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQ6IGFzeW5jICh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQnLCAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnLCB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUZwID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gUGxhaWRBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYXNlUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFzZVJlcG9ydEdldChiYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdH0gYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0uICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGAgcmV0dXJucyBwYXJzZWQgZGF0YSBmcm9tIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB1c2VycyBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gSWYgeW91ciBhY2NvdW50IGlzIG5vdCBlbmFibGVkIGZvciBEb2N1bWVudCBQYXJzaW5nLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudCAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlbiAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9mIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGZpZWxkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgdXNlciBhbHJlYWR5IGhhcyBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYW4gYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdDogSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbi4gT24gYW4gdW5saW5rIHJlcXVlc3QsIFBsYWlkIHdpbGwgaW1tZWRpYXRlbHkgcmV2b2tlIHRoZSBBcHBsaWNhdGlvbuKAmXMgYWNjZXNzIHRvIHRoZSBVc2Vy4oCZcyBkYXRhLiAgVGhlIFVzZXIgd2lsbCBoYXZlIHRvIHJlZG8gdGhlIE9BdXRoIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gcmVzdG9yZSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBlbmRwb2ludCBvbmx5IHJlbW92ZXMgb25nb2luZyBkYXRhIGFjY2VzcyBwZXJtaXNzaW9ucywgdGhlcmVmb3JlIHRoZSBVc2VyIHdpbGwgbmVlZCB0byByZWFjaCBvdXQgdG8gdGhlIEFwcGxpY2F0aW9uIGl0c2VsZiBpbiBvcmRlciB0byBkaXNhYmxlIGFuZCBkZWxldGUgdGhlaXIgYWNjb3VudCBhbmQgZGVsZXRlIGFueSBkYXRhIHRoYXQgdGhlIEFwcGxpY2F0aW9uIGFscmVhZHkgcmVjZWl2ZWQgKGlmIHRoZSBBcHBsaWNhdGlvbiBkb2VzIG5vdCBkbyBzbyBieSBkZWZhdWx0KS4gIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBpbiByZWFsIHRpbWUgYXMgdGhlIFVzZXIgaXMgdW5saW5raW5nIGFuIEFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2UgaXMgcmVmbGVjdGVkIGFzIHNvb24gYXMgcG9zc2libGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtSW1wb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVwbGFjZXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGl0cyBhc3NvY2lhdGVkIHdlYmhvb2tzIGZvciBtb3N0IGNvbW1vbiB1c2UtY2FzZXMuICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9jZXNzb3IgdG9rZW4gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgcHJvY2Vzc29yIHRva2VuLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUsIHdoaWNoIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBmb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzb3IgdG9rZW5zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBUcmFuc2FjdGlvbnMgdXBkYXRlIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEFjY291bnQgU2VsZWN0IHYyLiAgYEFVVEhfREFUQV9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQXV0aCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQgKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxQcmVwYXJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFN0YXRlbWVudHNMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXIuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFByb2Nlc3Npbmcgb2YgdGhlIHJlZnVuZCB3aWxsIG5vdCBvY2N1ciB1bnRpbCBhdCBsZWFzdCA0IGJ1c2luZXNzIGRheXMgZm9sbG93aW5nIHRoZSB0cmFuc2ZlclxcJ3Mgc2V0dGxlbWVudCBkYXRlLCBwbHVzIGFueSBob2xkL3NldHRsZW1lbnQgZGVsYXlzLiBUaGlzIDMtZGF5IHdpbmRvdyBoZWxwcyBiZXR0ZXIgcHJvdGVjdCB5b3VyIGJ1c2luZXNzIGZyb20gcmVndWxhciBBQ0ggcmV0dXJucy4gQ29uc3VtZXIgaW5pdGlhdGVkIHJldHVybnMgKHVuYXV0aG9yaXplZCByZXR1cm5zKSBjb3VsZCBzdGlsbCBoYXBwZW4gZm9yIGFib3V0IDYwIGRheXMgZnJvbSB0aGUgc2V0dGxlbWVudCBkYXRlLiBJZiB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgaXMgY2FuY2VsZWQsIHJldHVybmVkIG9yIGZhaWxlZCwgYWxsIHBlbmRpbmcgcmVmdW5kcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2FuY2VsZWQuIFByb2Nlc3NlZCByZWZ1bmRzIGNhbm5vdCBiZSByZXZva2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBQbGFpZEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBjdXN0b21lciB0byByZXRyaWV2ZSBhIEJhc2UgUmVwb3J0LiBDdXN0b21lcnMgc2hvdWxkIHBhc3MgaW4gdGhlIGB1c2VyX3Rva2VuYCBjcmVhdGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmFzZVJlcG9ydEdldFJlcXVlc3R9IGJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFzZVJlcG9ydEdldChiYXNlUmVwb3J0R2V0UmVxdWVzdDogQmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFzZVJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbS4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIHBhcnRpY2lwYXRpbmcgR292ZXJubWVudCBTcG9uc29yZWQgRW50aXR5IChHU0UpLiBJZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgdG9rZW4gZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZi4gQW4gQXVkaXQgQ29weSB0b2tlbiBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCAocmVzdWx0IG9mIC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0KS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnQgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRhc2hib2FyZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGZpZWxkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgdXNlciBhbHJlYWR5IGhhcyBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYW4gYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnRzLCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gXFxcIk5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSB1cGRhdGUgbW9kZSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIElkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBCYW5rIGFjY291bnQgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gSWYgdGhlIGFjY291bnQgbXVzdCBiZSBsaW5rZWQgdG8gYSBuZXcgb3IgZGlmZmVyZW50IHBhcnRuZXIgcmVzb3VyY2UsIGNyZWF0ZSBhIG5ldyBJdGVtIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cgYWdhaW47IGEgbmV3IHByb2Nlc3NvciB0b2tlbiBjYW4gdGhlbiBiZSBjcmVhdGVkIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gUHJvY2Vzc29yIHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVwbGFjZXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGl0cyBhc3NvY2lhdGVkIHdlYmhvb2tzIGZvciBtb3N0IGNvbW1vbiB1c2UtY2FzZXMuICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9jZXNzb3IgdG9rZW4gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgcHJvY2Vzc29yIHRva2VuLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUsIHdoaWNoIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBmb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzb3IgdG9rZW5zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFRyYW5zYWN0aW9ucyB1cGRhdGUgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQWNjb3VudCBTZWxlY3QgdjIuICBgQVVUSF9EQVRBX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBdXRoIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgaW5jb21lIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgaW5jb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmFzZVJlcG9ydEdldFJlcXVlc3R9IGJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFzZVJlcG9ydEdldChiYXNlUmVwb3J0R2V0UmVxdWVzdDogQmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgY2F0ZWdvcmllc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYGZyYXVkX3Jpc2tgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBmcmF1ZCBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBtYW51YWxseSB1cGxvYWRlZCBkb2N1bWVudChzKS5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudCAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlbiAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZGFzaGJvYXJkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgaWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIElkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudHMsIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBcXFwiTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBQcm9kdWN0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIElkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmVwbGFjZXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGl0cyBhc3NvY2lhdGVkIHdlYmhvb2tzIGZvciBtb3N0IGNvbW1vbiB1c2UtY2FzZXMuICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9jZXNzb3IgdG9rZW4gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgcHJvY2Vzc29yIHRva2VuLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUsIHdoaWNoIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBmb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzb3IgdG9rZW5zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFRyYW5zYWN0aW9ucyB1cGRhdGUgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQWNjb3VudCBTZWxlY3QgdjIuICBgQVVUSF9EQVRBX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBdXRoIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbm5vdCBiZSB1c2VkIHdpdGggT0F1dGggaW5zdGl0dXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIExpbmsgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcywgZGV2ZWxvcGluZyBhIFNpZ25hbCBzY29yZS4gIElmIHlvdSBhcmUgdXNpbmcgb3RoZXIgUGxhaWQgcHJvZHVjdHMgYWZ0ZXIgTGluaywgZS5nLiBJZGVudGl0eSBvciBBc3NldHMsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgYWZ0ZXIgdGhvc2UgcHJvZHVjdCBjYWxscyBhcmUgY29tcGxldGUuICBFeGFtcGxlIGZsb3c6IExpbmsgaXMgaW5pdGlhbGl6ZWQgd2l0aCBBdXRoLCBjYWxsIGAvYXV0aC9nZXRgIGZvciB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIsIGNhbGwgYC9pZGVudGl0eS9nZXRgIHRvIHJldHJpZXZlIGJhbmsgb3duZXJzaGlwIGRldGFpbHMsIHRoZW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBiZWdpbiBTaWduYWwgZGF0YSBjb2xsZWN0aW9uLiBMYXRlciwgb25jZSB5b3UgaGF2ZSBvYnRhaW5lZCBkZXRhaWxzIGFib3V0IHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSB1c2VyLCBjYWxsIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgYSBTaWduYWwgc2NvcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgW1JlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgd2l0aCBzcGVjaWZpYyBwcm9kdWN0IGNvbWJpbmF0aW9uc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlY29tbWVuZGF0aW9ucy1mb3ItaW5pdGlhbGl6aW5nLWxpbmstd2l0aC1zcGVjaWZpYy1wcm9kdWN0LWNvbWJpbmF0aW9ucykuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWxcbiAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIHNldCBvZiByZXR1cm5zIHRoYXQgd2VyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuIFRoZSBzdW0gb2YgYW1vdW50cyBvZiByZXR1cm5zIHJldHJpZXZlZCBieSB0aGlzIHJlcXVlc3QgZXF1YWxzIHRoZSBhbW91bnQgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBpbmNvbWUgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBpbmNvbWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBUaGUgYHVzZXJfdG9rZW5gIHNob3VsZCBiZSBpbiB0aGUgcmVzcG9uc2Ugb2YgYC91c2VyL2NyZWF0ZWAgY2FsbCAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IHdpdGggYSBub24tZXhpc3QgYHVzZXJfdG9rZW5gLCB0aGUgY2FsbCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciB0b2tlbiBpcyBub3QgZm91bmQuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGEgc3BlY2lmaWMgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGN1c3RvbWVyIGluZm9ybWF0aW9uLCBjb3JyZWN0IG91dGRhdGVkIGluZm9ybWF0aW9uLCBhZGQgYSByZWZlcmVuY2UgaWQsIGFzc2lnbiB0aGUgaW5kaXZpZHVhbCB0byBhIHJldmlld2VyLCBhbmQgdXBkYXRlIHdoaWNoIHByb2dyYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbm90IHVwZGF0ZSBgc2VhcmNoX3Rlcm1zYCBhbmQgYHN0YXR1c2AgYXQgdGhlIHNhbWUgdGltZSBzaW5jZSBlZGl0aW5nIGBzZWFyY2hfdGVybXNgIG1heSB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBgc3RhdHVzYCBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG4iXX0= \ No newline at end of file diff --git a/dist/base.d.ts b/dist/base.d.ts index ecacb646..c7b67357 100644 --- a/dist/base.d.ts +++ b/dist/base.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/base.js b/dist/base.js index 4146c097..ed9847a1 100644 --- a/dist/base.js +++ b/dist/base.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -62,4 +62,4 @@ class RequiredError extends Error { } } exports.RequiredError = RequiredError; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4NS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4NS4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/common.d.ts b/dist/common.d.ts index fe21578b..afde1591 100644 --- a/dist/common.d.ts +++ b/dist/common.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/common.js b/dist/common.js index d82a01cd..a58c3b57 100644 --- a/dist/common.js +++ b/dist/common.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -150,4 +150,4 @@ const createRequestFunction = function (axiosArgs, globalAxios, BASE_PATH, confi }; }; exports.createRequestFunction = createRequestFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/configuration.d.ts b/dist/configuration.d.ts index c22de7f8..e916960a 100644 --- a/dist/configuration.d.ts +++ b/dist/configuration.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/configuration.js b/dist/configuration.js index 5b353c44..9a5673a1 100644 --- a/dist/configuration.js +++ b/dist/configuration.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -32,7 +32,7 @@ class Configuration { this.baseOptions = {}; if (!this.baseOptions.headers) this.baseOptions.headers = {}; - this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v18.3.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); + this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v19.0.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); } /** * Check if the given MIME is a JSON MIME. @@ -50,4 +50,4 @@ class Configuration { } } exports.Configuration = Configuration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQ3BDLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmF0aW9uUGFyYW1ldGVycyB7XG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG59XG5cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZXMgMTYtMjVcbmludGVyZmFjZSBQbGFpZEVudmlyb25tZW50IHtcbiAgW2Vudjogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgUGxhaWRFbnZpcm9ubWVudHM6IFBsYWlkRW52aXJvbm1lbnQgPSB7XG4gIHByb2R1Y3Rpb246ICdodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tJyxcbiAgc2FuZGJveDogJ2h0dHBzOi8vc2FuZGJveC5wbGFpZC5jb20nLFxuICBkZXZlbG9wbWVudDogJ2h0dHBzOi8vZGV2ZWxvcG1lbnQucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MTguMy4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQ3BDLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmF0aW9uUGFyYW1ldGVycyB7XG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG59XG5cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZXMgMTYtMjVcbmludGVyZmFjZSBQbGFpZEVudmlyb25tZW50IHtcbiAgW2Vudjogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgUGxhaWRFbnZpcm9ubWVudHM6IFBsYWlkRW52aXJvbm1lbnQgPSB7XG4gIHByb2R1Y3Rpb246ICdodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tJyxcbiAgc2FuZGJveDogJ2h0dHBzOi8vc2FuZGJveC5wbGFpZC5jb20nLFxuICBkZXZlbG9wbWVudDogJ2h0dHBzOi8vZGV2ZWxvcG1lbnQucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MTkuMC4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 59f9ca0c..2d13a9dd 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/index.js b/dist/index.js index 72e852fc..4101ea3d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -25,4 +25,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { Object.defineProperty(exports, "__esModule", { value: true }); __exportStar(require("./api"), exports); __exportStar(require("./configuration"), exports); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNDg1LjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNDg1LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file diff --git a/index.ts b/index.ts index e9944dd0..47ef0d31 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.485.0 + * The version of the OpenAPI document: 2020-09-14_1.485.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/package.json b/package.json index 6818d6c8..a53867b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "18.3.0", + "version": "19.0.0", "description": "A node.js client for the Plaid API", "keywords": [ "plaid", diff --git a/templates/typescript-axios/modelGeneric.mustache b/templates/typescript-axios/modelGeneric.mustache index e17cd572..b2b5980b 100644 --- a/templates/typescript-axios/modelGeneric.mustache +++ b/templates/typescript-axios/modelGeneric.mustache @@ -3,12 +3,8 @@ * @export * @interface {{classname}} */ -// Edited by Plaid, line 9. any to unknown +{{! Edited by Plaid, line 8. remove index signature }} export interface {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ -{{#additionalPropertiesType}} - [key: string]: {{{additionalPropertiesType}}}{{#hasVars}} | unknown{{/hasVars}}; - -{{/additionalPropertiesType}} {{#vars}} /** * {{{description}}}